diff options
Diffstat (limited to 'forum/skins')
-rw-r--r-- | forum/skins/__init__.py | 57 | ||||
-rw-r--r-- | forum/skins/default/media/js/com.cnprog.post.js | 28 | ||||
-rw-r--r-- | forum/skins/default/media/js/com.cnprog.tag_selector.js | 6 | ||||
-rw-r--r-- | forum/skins/default/media/js/com.cnprog.utils.js | 18 | ||||
-rw-r--r-- | forum/skins/default/media/js/wmd/wmd.js | 6 | ||||
-rwxr-xr-x | forum/skins/default/templates/base.html | 24 | ||||
-rw-r--r-- | forum/skins/default/templates/base_content.html | 29 | ||||
-rw-r--r-- | forum/skins/default/templates/question.html | 54 |
8 files changed, 123 insertions, 99 deletions
diff --git a/forum/skins/__init__.py b/forum/skins/__init__.py new file mode 100644 index 00000000..be6bd4f3 --- /dev/null +++ b/forum/skins/__init__.py @@ -0,0 +1,57 @@ +from django.conf import settings +from django.template import loader +from django.template.loaders import filesystem +from django.http import HttpResponse +import os.path +import logging + +#module for skinning osqa +#at this point skin can be changed only in settings file +#via OSQA_DEFAULT_SKIN variable + +#note - Django template loaders use method django.utils._os.safe_join +#to work on unicode file paths +#here it is ignored because it is assumed that we won't use unicode paths + +def load_template_source(name, dirs=None): + try: + tname = os.path.join(settings.OSQA_DEFAULT_SKIN,'templates',name) + return filesystem.load_template_source(tname,dirs) + except: + tname = os.path.join('default','templates',name) + return filesystem.load_template_source(tname,dirs) +load_template_source.is_usable = True + +def find_media_source(url): + """returns url prefixed with the skin name + of the first skin that contains the file + directories are searched in this order: + settings.OSQA_DEFAULT_SKIN, then 'default', then 'commmon' + if file is not found - returns None + and logs an error message + """ + while url[0] == '/': url = url[1:] + d = os.path.dirname + n = os.path.normpath + j = os.path.join + f = os.path.isfile + skins = n(j(d(d(__file__)),'skins')) + try: + media = os.path.join(skins, settings.OSQA_DEFAULT_SKIN, url) + assert(f(media)) + use_skin = settings.OSQA_DEFAULT_SKIN + except: + try: + media = j(skins, 'default', url) + assert(f(media)) + use_skin = 'default' + except: + media = j(skins, 'common', url) + try: + assert(f(media)) + use_skin = 'common' + except: + logging.error('could not find media for %s' % url) + use_skin = '' + return None + return use_skin + '/' + url diff --git a/forum/skins/default/media/js/com.cnprog.post.js b/forum/skins/default/media/js/com.cnprog.post.js index 5469a374..4325e665 100644 --- a/forum/skins/default/media/js/com.cnprog.post.js +++ b/forum/skins/default/media/js/com.cnprog.post.js @@ -153,17 +153,17 @@ var Vote = function(){ var setVoteImage = function(voteType, undo, object){ var flag = undo ? "" : "-on"; var arrow = (voteType == VoteType.questionUpVote || voteType == VoteType.answerUpVote) ? "up" : "down"; - object.attr("src", scriptUrl + "media/images/vote-arrow-"+ arrow + flag +".png"); + object.attr("src", mediaUrl("media/images/vote-arrow-"+ arrow + flag +".png")); // if undo voting, then undo the pair of arrows. if(undo){ if(voteType == VoteType.questionUpVote || voteType == VoteType.questionDownVote){ - $(getQuestionVoteUpButton()).attr("src", scriptUrl + "media/images/vote-arrow-up.png"); - $(getQuestionVoteDownButton()).attr("src", scriptUrl + "media/images/vote-arrow-down.png"); + $(getQuestionVoteUpButton()).attr("src", mediaUrl("media/images/vote-arrow-up.png")); + $(getQuestionVoteDownButton()).attr("src", mediaUrl("media/images/vote-arrow-down.png")); } else{ - $(getAnswerVoteUpButton(postId)).attr("src", scriptUrl + "media/images/vote-arrow-up.png"); - $(getAnswerVoteDownButton(postId)).attr("src", scriptUrl + "media/images/vote-arrow-down.png"); + $(getAnswerVoteUpButton(postId)).attr("src", mediaUrl("media/images/vote-arrow-up.png")); + $(getAnswerVoteDownButton(postId)).attr("src", mediaUrl("media/images/vote-arrow-down.png")); } } }; @@ -259,19 +259,19 @@ var Vote = function(){ showMessage(object, acceptOwnAnswerMessage); } else if(data.status == "1"){ - object.attr("src", scriptUrl + "media/images/vote-accepted.png"); + object.attr("src", mediaUrl("media/images/vote-accepted.png")); $("#"+answerContainerIdPrefix+postId).removeClass("accepted-answer"); $("#"+commentLinkIdPrefix+postId).removeClass("comment-link-accepted"); } else if(data.success == "1"){ var acceptedButtons = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAccept +']'; - $(acceptedButtons).attr("src", scriptUrl + "media/images/vote-accepted.png"); + $(acceptedButtons).attr("src", mediaUrl("media/images/vote-accepted.png")); var answers = ("div[id^="+answerContainerIdPrefix +"]"); $(answers).removeClass("accepted-answer"); var commentLinks = ("div[id^="+answerContainerIdPrefix +"] div[id^="+ commentLinkIdPrefix +"]"); $(commentLinks).removeClass("comment-link-accepted"); - object.attr("src", scriptUrl + "media/images/vote-accepted-on.png"); + object.attr("src", mediaUrl("media/images/vote-accepted-on.png")); $("#"+answerContainerIdPrefix+postId).addClass("accepted-answer"); $("#"+commentLinkIdPrefix+postId).addClass("comment-link-accepted"); } @@ -285,7 +285,7 @@ var Vote = function(){ showMessage(object, favoriteAnonymousMessage.replace("{{QuestionID}}", questionId)); } else if(data.status == "1"){ - object.attr("src", scriptUrl + "media/images/vote-favorite-off.png"); + object.attr("src", mediaUrl("media/images/vote-favorite-off.png")); var fav = getFavoriteNumber(); fav.removeClass("my-favorite-number"); if(data.count === 0){ @@ -294,7 +294,7 @@ var Vote = function(){ fav.text(data.count); } else if(data.success == "1"){ - object.attr("src", scriptUrl + "media/images/vote-favorite-on.png"); + object.attr("src", mediaUrl("media/images/vote-favorite-on.png")); var fav = getFavoriteNumber(); fav.text(data.count); fav.addClass("my-favorite-number"); @@ -538,8 +538,8 @@ function createComments(type) { var renderDeleteCommentIcon = function(post_id, delete_url){ if (canPostComments(post_id)){ var html = ''; - var img = scriptUrl + "media/images/close-small.png"; - var imgHover = scriptUrl + "media/images/close-small-hover.png"; + var img = mediaUrl("media/images/close-small.png"); + var imgHover = mediaUrl("media/images/close-small-hover.png"); html += '<img class="delete-icon" onclick="' + objectType + 'Comments.deleteComment($(this), ' + post_id + ', \'' + delete_url + '\')" src="' + img; html += '" onmouseover="$(this).attr(\'src\', \'' + imgHover + '\')" onmouseout="$(this).attr(\'src\', \'' + img; html += '\')" title="' + $.i18n._('delete this comment') + '" />'; @@ -624,12 +624,12 @@ function createComments(type) { delete_icon.click(function(){CommentsClass.deleteComment($(this),comment_id,delete_url);}); delete_icon.unbind('mouseover').bind('mouseover', function(){ - $(this).attr('src',scriptUrl + 'media/images/close-small-hover.png'); + $(this).attr('src',mediaUrl('media/images/close-small-hover.png')); } ); delete_icon.unbind('mouseout').bind('mouseout', function(){ - $(this).attr('src',scriptUrl + 'media/images/close-small.png'); + $(this).attr('src',mediaUrl('media/images/close-small.png')); } ); } diff --git a/forum/skins/default/media/js/com.cnprog.tag_selector.js b/forum/skins/default/media/js/com.cnprog.tag_selector.js index 5cfc3561..e3279e65 100644 --- a/forum/skins/default/media/js/com.cnprog.tag_selector.js +++ b/forum/skins/default/media/js/com.cnprog.tag_selector.js @@ -45,10 +45,10 @@ function pickedTags(){ var setupTagDeleteEvents = function(obj,tag_store,tagname,reason,send_ajax){ obj.unbind('mouseover').bind('mouseover', function(){ - $(this).attr('src', scriptUrl + 'media/images/close-small-hover.png'); + $(this).attr('src', mediaUrl('media/images/close-small-hover.png')); }); obj.unbind('mouseout').bind('mouseout', function(){ - $(this).attr('src', scriptUrl + 'media/images/close-small-dark.png'); + $(this).attr('src', mediaUrl('media/images/close-small-dark.png')); }); obj.click( function(){ unpickTag(tag_store,tagname,reason,send_ajax); @@ -88,7 +88,7 @@ function pickedTags(){ tag_link.html(tagname); var del_link = $('<img></img>'); del_link.addClass('delete-icon'); - del_link.attr('src', scriptUrl + 'media/images/close-small-dark.png'); + del_link.attr('src', mediaUrl('/media/images/close-small-dark.png')); setupTagDeleteEvents(del_link, to_target, tagname, reason, true); diff --git a/forum/skins/default/media/js/com.cnprog.utils.js b/forum/skins/default/media/js/com.cnprog.utils.js index 7d8ea1f8..93083288 100644 --- a/forum/skins/default/media/js/com.cnprog.utils.js +++ b/forum/skins/default/media/js/com.cnprog.utils.js @@ -1,7 +1,11 @@ -//var $, scriptUrl; +//var $, scriptUrl, osqaSkin +var mediaUrl = function(resource){ + return scriptUrl + 'm/' + osqaSkin + '/' + resource; +}; + var showMessage = function(object, msg) { var div = $('<div class="vote-notification"><h3>' + msg + '</h3>(' + - $.i18n._('click to close') + ')</div>'); + $.i18n._('click to close') + ')</div>'); div.click(function(event) { $(".vote-notification").fadeOut("fast", function() { $(this).remove(); }); @@ -37,11 +41,11 @@ var notify = function() { function appendLoader(containerSelector) { $(containerSelector).append('<img class="ajax-loader" ' + - 'src="' + scriptUrl + 'media/images/indicator.gif" title="' + - $.i18n._('loading...') + - '" alt="' + - $.i18n._('loading...') + - '" />'); + 'src="mediaUrl("media/images/indicator.gif")" title="' + + $.i18n._('loading...') + + '" alt="' + + $.i18n._('loading...') + + '" />'); } function removeLoader() { diff --git a/forum/skins/default/media/js/wmd/wmd.js b/forum/skins/default/media/js/wmd/wmd.js index 6277de90..9888cda0 100644 --- a/forum/skins/default/media/js/wmd/wmd.js +++ b/forum/skins/default/media/js/wmd/wmd.js @@ -52,9 +52,9 @@ Attacklab.wmdBase = function(){ var imageDialogText = "<p style='margin-top: 0px'>" + $.i18n._('enter image url') + '</p>'; var linkDialogText = "<p style='margin-top: 0px'>" + $.i18n._('enter url') + '</p>'; var uploadImageHTML ="<div>" + $.i18n._('upload image') + "</div>" + - "<input type=\"file\" name=\"file-upload\" id=\"file-upload\" size=\"26\" "+ - "onchange=\"return ajaxFileUpload($('#image-url'));\"/><br>" + - "<img id=\"loading\" src=\"" + scriptUrl + "media/images/indicator.gif\" style=\"display:none;\"/>"; + '<input type="file" name="file-upload" id="file-upload" size="26" '+ + 'onchange="return ajaxFileUpload($("#image-url"));"/><br>' + + '<img id="loading" src="mediaUrl("media/images/indicator.gif")" style="display:none;"/>'; // The default text that appears in the dialog input box when entering // links. diff --git a/forum/skins/default/templates/base.html b/forum/skins/default/templates/base.html index 9fabe7a1..9033b0c9 100755 --- a/forum/skins/default/templates/base.html +++ b/forum/skins/default/templates/base.html @@ -17,30 +17,14 @@ <link href="{% media "/media/style/style.css" %}" rel="stylesheet" type="text/css" /> <script src="http://www.google.com/jsapi" type="text/javascript"></script> <script type="text/javascript">google.load("jquery", "1.2.6");</script> - <script type="text/javascript"> + <script type="text/javascript"> var i18nLang = '{{settings.LANGUAGE_CODE}}'; var scriptUrl = '/{{settings.FORUM_SCRIPT_ALIAS}}' - </script> + var osqaSkin = '{{settings.OSQA_SKIN}}'; + </script> <script type='text/javascript' src='{% media "/media/js/com.cnprog.i18n.js" %}'></script> - <script type='text/javascript' src='{% media "/media/js/jquery.i18n.js" %}'></script> + <script type='text/javascript' src='{% media "/media/js/jquery.i18n.js" %}'></script> <script type='text/javascript' src='{% media "/media/js/com.cnprog.utils.js" %}'></script> - <!--<script type="text/javascript"> - var uservoiceJsHost = ("https:" == document.location.protocol) ? "https://uservoice.com" : "http://cdn.uservoice.com"; - document.write(unescape("%3Cscript src='" + uservoiceJsHost + "/javascripts/widgets/tab.js' type='text/javascript'%3E%3C/script%3E")) - </script> - <script type="text/javascript"> - UserVoice.Tab.show({ - key: 'cnprog', - host: 'cnprog.uservoice.com', - forum: 'general', - alignment: 'left', /* 'left', 'right' */ - background_color:'#777', - text_color: 'white', /* 'white', 'black' */ - hover_color: '#06C', - lang: 'en' /* 'en', 'de', 'nl', 'es', 'fr' */ - }) - </script>--> - <!-- todo move this to settings --> {% if user_messages %} <style type="text/css"> body { margin-top:2.4em; } diff --git a/forum/skins/default/templates/base_content.html b/forum/skins/default/templates/base_content.html index 7f1ddf22..d1cf673b 100644 --- a/forum/skins/default/templates/base_content.html +++ b/forum/skins/default/templates/base_content.html @@ -11,38 +11,19 @@ {% endif %} <link rel="shortcut icon" href="{% media "/media/images/favicon.ico" %}" /> <link href="{% media "/media/style/style.css" %}" rel="stylesheet" type="text/css" /> - {% spaceless %} + {% spaceless %} {% block forestyle %}{% endblock %} {% endspaceless %} <script src="http://www.google.com/jsapi" type="text/javascript"></script> <script type="text/javascript">google.load("jquery", "1.2.6");</script> - <script type="text/javascript"> + <script type="text/javascript"> var i18nLang = '{{ settings.LANGUAGE_CODE }}'; var scriptUrl = '/{{settings.FORUM_SCRIPT_ALIAS}}' - </script> + var osqaSkin = '{{settings.OSQA_SKIN}}'; + </script> <script type='text/javascript' src='{% media "/media/js/com.cnprog.i18n.js" %}'></script> - <script type='text/javascript' src='{% media "/media/js/jquery.i18n.js" %}'></script> + <script type='text/javascript' src='{% media "/media/js/jquery.i18n.js" %}'></script> <script type='text/javascript' src='{% media "/media/js/com.cnprog.utils.js" %}'></script> - - <!-- <script type="text/javascript"> - var uservoiceJsHost = ("https:" == document.location.protocol) ? "https://uservoice.com" : "http://cdn.uservoice.com"; - document.write(unescape("%3Cscript src='" + uservoiceJsHost + "/javascripts/widgets/tab.js' type='text/javascript'%3E%3C/script%3E")) - </script> - <script type="text/javascript"> - UserVoice.Tab.show({ - //EDIT!!! - key: 'uservoicekey', - host: 'where.uservoice.com', - forum: 'general', - alignment: 'left', /* 'left', 'right' */ - background_color:'#777', - text_color: 'white', /* 'white', 'black' */ - hover_color: '#06C', - lang: 'en' /* 'en', 'de', 'nl', 'es', 'fr' */ - }) - </script>--> - <!-- todo move this to settings--> - {% if user_messages %} <style type="text/css"> body { margin-top:2.4em; } diff --git a/forum/skins/default/templates/question.html b/forum/skins/default/templates/question.html index 048c2d64..34f8fd1d 100644 --- a/forum/skins/default/templates/question.html +++ b/forum/skins/default/templates/question.html @@ -70,55 +70,53 @@ {% if question_vote %}
<img id="question-img-upvote-{{ question.id }}" class="question-img-upvote"
{% if question_vote.is_upvote %}
- src="{% media "/media/images/vote-arrow-up-on.png" %}"
+ src="{% media "/media/images/vote-arrow-up-on.png" %}"
{% else %}
- src="{% media "/media/images/vote-arrow-up.png" %}"
+ src="{% media "/media/images/vote-arrow-up.png" %}"
{% endif %}
alt="{% trans "i like this post (click again to cancel)" %}"
- title="{% trans "i like this post (click again to cancel)" %}" />
+ title="{% trans "i like this post (click again to cancel)" %}" />
<div id="question-vote-number-{{ question.id }}" class="vote-number"
- title="{% trans "current number of votes" %}">
+ title="{% trans "current number of votes" %}">
{{ question.score }}
</div>
<img id="question-img-downvote-{{ question.id }}" class="question-img-downvote"
{% if question_vote.is_downvote %}
- src="{% media "/media/images/vote-arrow-down-on.png" %}"
+ src="{% media "/media/images/vote-arrow-down-on.png" %}"
{% else %}
- src="{% media "/media/images/vote-arrow-down.png" %}"
+ src="{% media "/media/images/vote-arrow-down.png" %}"
{% endif %}
alt="{% trans "i dont like this post (click again to cancel)" %}"
- title="{% trans "i dont like this post (click again to cancel)" %}" />
+ title="{% trans "i dont like this post (click again to cancel)" %}" />
{% else %}
<img id="question-img-upvote-{{ question.id }}" class="question-img-upvote"
alt="{% trans "i like this post (click again to cancel)" %}"
- src="{% media "/media/images/vote-arrow-up.png" %}"
- title="{% trans "i like this post (click again to cancel)" %}" />
+ src="{% media "/media/images/vote-arrow-up.png" %}"
+ title="{% trans "i like this post (click again to cancel)" %}" />
<div id="question-vote-number-{{ question.id }}" class="vote-number"
- title="{% trans "current number of votes" %}">
+ title="{% trans "current number of votes" %}">
{{ question.score }}
</div>
<img id="question-img-downvote-{{ question.id }}" class="question-img-downvote"
- src="{% media "/media/images/vote-arrow-down.png" %}"
+ src="{% media "/media/images/vote-arrow-down.png" %}"
alt="{% trans "i dont like this post (click again to cancel)" %}"
title="{% trans "i dont like this post (click again to cancel)" %}" />
-
{% endif %}
{% if favorited %}
<img class="question-img-favorite" src="{% media "/media/images/vote-favorite-on.png" %}"
- alt="{% trans "mark this question as favorite (click again to cancel)" %}"
- title="{% trans "mark this question as favorite (click again to cancel)" %}" />
+ alt="{% trans "mark this question as favorite (click again to cancel)" %}"
+ title="{% trans "mark this question as favorite (click again to cancel)" %}" />
<div id="favorite-number" class="favorite-number my-favorite-number">
{{ question.favourite_count }}
</div>
{% else %}
<img class="question-img-favorite" src="{% media "/media/images/vote-favorite-off.png" %}"
- alt="{% trans "remove favorite mark from this question (click again to restore mark)" %}"
- title="{% trans "remove favorite mark from this question (click again to restore mark)" %}" />
+ alt="{% trans "remove favorite mark from this question (click again to restore mark)" %}"
+ title="{% trans "remove favorite mark from this question (click again to restore mark)" %}" />
<div id="favorite-number" class="favorite-number">
{% ifnotequal question.favourite_count 0 %}{{ question.favourite_count }}{% endifnotequal %}
</div>
-
{% endif %}
</div>
@@ -217,8 +215,8 @@ {% if question.closed %}
<div class="question-status" style="margin-bottom:15px">
<h3>{% blocktrans with question.get_close_reason_display as close_reason %}The question has been closed for the following reason "{{ close_reason }}" by{% endblocktrans %}
- <a href="{{ question.closed_by.get_profile_url }}">{{ question.closed_by.username }}</a>
- {% blocktrans with question.closed_at as closed_at %}close date {{closed_at}}{% endblocktrans %}</h3>
+ <a href="{{ question.closed_by.get_profile_url }}">{{ question.closed_by.username }}</a>
+ {% blocktrans with question.closed_at as closed_at %}close date {{closed_at}}{% endblocktrans %}</h3>
</div>
{% endif %}
{% if answers %}
@@ -258,21 +256,21 @@ {{ answer.score }}
</div>
<img id="answer-img-downvote-{{ answer.id }}" class="answer-img-downvote"
- src="{% blockmedia %}/media/images/vote-arrow-down{% get_user_vote_image user_answer_votes answer.id -1 %}.png{% endblockmedia %}"
- alt="{% trans "i dont like this answer (click again to cancel)" %}"
- title="{% trans "i dont like this answer (click again to cancel)" %}" />
+ src="{% blockmedia %}/media/images/vote-arrow-down{% get_user_vote_image user_answer_votes answer.id -1 %}.png{% endblockmedia %}"
+ alt="{% trans "i dont like this answer (click again to cancel)" %}"
+ title="{% trans "i dont like this answer (click again to cancel)" %}" />
{% ifequal request.user question.author %}
<img id="answer-img-accept-{{ answer.id }}" class="answer-img-accept"
- src="{% blockmedia %}/media/images/vote-accepted{% if answer.accepted %}-on{% endif %}.png{% endblockmedia %}"
- alt="{% trans "mark this answer as favorite (click again to undo)" %}"
- title="{% trans "mark this answer as favorite (click again to undo)" %}" />
+ src="{% blockmedia %}/media/images/vote-accepted{% if answer.accepted %}-on{% endif %}.png{% endblockmedia %}"
+ alt="{% trans "mark this answer as favorite (click again to undo)" %}"
+ title="{% trans "mark this answer as favorite (click again to undo)" %}" />
{% else %}
{% if answer.accepted %}
<img id="answer-img-accept-{{ answer.id }}" class="answer-img-accept"
- src="{% blockmedia %}/media/images/vote-accepted{% if answer.accepted %}-on{% endif %}.png{% endblockmedia %}"
- alt="{% trans "the author of the question has selected this answer as correct" %}"
- title="{% trans "the author of the question has selected this answer as correct" %}" />
+ src="{% blockmedia %}/media/images/vote-accepted{% if answer.accepted %}-on{% endif %}.png{% endblockmedia %}"
+ alt="{% trans "the author of the question has selected this answer as correct" %}"
+ title="{% trans "the author of the question has selected this answer as correct" %}" />
{% endif %}
{% endifequal %}
</div>
|