summaryrefslogtreecommitdiffstats
path: root/forum/skins
diff options
context:
space:
mode:
Diffstat (limited to 'forum/skins')
-rw-r--r--forum/skins/__init__.py57
-rw-r--r--forum/skins/default/media/js/com.cnprog.post.js28
-rw-r--r--forum/skins/default/media/js/com.cnprog.tag_selector.js6
-rw-r--r--forum/skins/default/media/js/com.cnprog.utils.js18
-rw-r--r--forum/skins/default/media/js/wmd/wmd.js6
-rwxr-xr-xforum/skins/default/templates/base.html24
-rw-r--r--forum/skins/default/templates/base_content.html29
-rw-r--r--forum/skins/default/templates/question.html54
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>