From: zuber Date: Wed, 2 Sep 2009 10:46:45 +0000 (+0200) Subject: Merge branch 'master' of git@stigma.nowoczesnapolska.org.pl:platforma X-Git-Url: https://git.mdrn.pl/redakcja.git/commitdiff_plain/5dd35dc51c94ec63a25ad17dca4259e7e80e2bc0?hp=a947b4266b1e464b54d47a7acfbeccc504b9f663 Merge branch 'master' of git@stigma.nowoczesnapolska.org.pl:platforma Conflicts: apps/explorer/views.py --- diff --git a/apps/explorer/fields.py b/apps/explorer/fields.py new file mode 100644 index 00000000..5d03e68d --- /dev/null +++ b/apps/explorer/fields.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +import datetime + +from django.conf import settings +from django.db import models +from django import forms +from django.utils import simplejson as json + + +class JSONEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime.datetime): + return obj.strftime('%Y-%m-%dT%H:%M:%S') + elif isinstance(obj, datetime.date): + return obj.strftime('%Y-%m-%d') + elif isinstance(obj, datetime.time): + return obj.strftime('%H:%M:%S') + return json.JSONEncoder.default(self, obj) + + +def dumps(data): + return JSONEncoder().encode(data) + + +def loads(str): + return json.loads(str, encoding=settings.DEFAULT_CHARSET) + + +class JSONFormField(forms.CharField): + widget = forms.Textarea + + def clean(self, value): + try: + loads(value) + return value + except ValueError, e: + raise forms.ValidationError('Enter a valid JSON value. Error: %s' % e) + + +class JSONField(models.TextField): + def formfield(self, **kwargs): + defaults = {'form_class': JSONFormField} + defaults.update(kwargs) + return super(JSONField, self).formfield(**defaults) + + def db_type(self): + return 'text' + + def get_internal_type(self): + return 'TextField' + + def contribute_to_class(self, cls, name): + super(JSONField, self).contribute_to_class(cls, name) + + def get_value(model_instance): + return loads(getattr(model_instance, self.attname, None)) + setattr(cls, 'get_%s_value' % self.name, get_value) + + def set_value(model_instance, json): + return setattr(model_instance, self.attname, dumps(json)) + setattr(cls, 'set_%s_value' % self.name, set_value) + diff --git a/apps/explorer/middleware.py b/apps/explorer/middleware.py new file mode 100644 index 00000000..661a7a64 --- /dev/null +++ b/apps/explorer/middleware.py @@ -0,0 +1,39 @@ +import urllib + +from django.conf import settings +from django.utils import simplejson + +from explorer import models + + +class EditorSettingsMiddleware(object): + def process_request(self, request): + if request.user.is_anonymous(): + return + cookie_settings = request.COOKIES.get(settings.EDITOR_COOKIE_NAME, '{}') + + cookie_settings = simplejson.loads(urllib.unquote(cookie_settings)) + last_update = cookie_settings.get('lastUpdate', 0) + + try: + editor_settings = models.EditorSettings.objects.get(user=request.user) + except models.EditorSettings.DoesNotExist: + editor_settings = models.EditorSettings(user=request.user) + editor_settings.set_settings_value(cookie_settings) + editor_settings.save() + + # print editor_settings.get_settings_value()['lastUpdate'], '<>', last_update + if editor_settings.get_settings_value()['lastUpdate'] < last_update: + print "\n\nZmiana!\n\n" + editor_settings.set_settings_value(cookie_settings) + editor_settings.save() + + request.editor_settings = editor_settings + + + def process_response(self, request, response): + if hasattr(request, 'editor_settings'): + response.set_cookie(settings.EDITOR_COOKIE_NAME, + urllib.quote(request.editor_settings.settings), max_age=7 * 60 * 60 * 24, path='/') + + return response diff --git a/apps/explorer/models.py b/apps/explorer/models.py index 9a5e0ffa..e47c26fe 100644 --- a/apps/explorer/models.py +++ b/apps/explorer/models.py @@ -5,17 +5,19 @@ from django.contrib.auth.models import User from django.conf import settings from django.utils.translation import gettext_lazy as _ -class PanelSettings(models.Model): - user = models.ForeignKey(User) - left_panel = models.CharField(blank=True, max_length=80) - right_panel = models.CharField(blank=True, max_length=80) +from explorer import fields + +class EditorSettings(models.Model): + user = models.ForeignKey(User, unique=True) + settings = fields.JSONField() + class Meta: - ordering = ['user__name'] - verbose_name, verbose_name_plural = _("panel settings"), _("panel settings") + verbose_name, verbose_name_plural = _("editor settings"), _("editor settings") def __unicode__(self): - return u"Panel settings for %s" % self.user.name + return u"Editor settings for %s" % self.user.username + class Book(models.Model): class Meta: @@ -24,6 +26,7 @@ class Book(models.Model): ) pass + class PullRequest(models.Model): comitter = models.ForeignKey(User) # the user who request the pull file = models.CharField(max_length=256) # the file to request diff --git a/apps/explorer/views.py b/apps/explorer/views.py index 3ab7e670..79160f8a 100644 --- a/apps/explorer/views.py +++ b/apps/explorer/views.py @@ -1,24 +1,18 @@ -# -*- coding: utf-8 -*- -from librarian import html -import hg, urllib2, time - -from django.utils import simplejson as json - -from librarian import dcparser, parser -from librarian import ParseError, ValidationError - -from django.views.generic.simple import direct_to_template +import urllib2 +import hg +from librarian import html, parser, dcparser, ParseError, ValidationError from django.conf import settings -from django.http import HttpResponseRedirect, HttpResponse - -from django.core.urlresolvers import reverse -from django.core.paginator import Paginator, InvalidPage, EmptyPage - from django.contrib.auth.decorators import login_required, permission_required +from django.core.paginator import Paginator, InvalidPage, EmptyPage +from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect, HttpResponse +from django.utils import simplejson as json +from django.views.generic.simple import direct_to_template from explorer import forms, models + # # Some useful decorators # diff --git a/project/settings.py b/project/settings.py index e958113d..3bfc7db0 100644 --- a/project/settings.py +++ b/project/settings.py @@ -75,6 +75,7 @@ MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'explorer.middleware.EditorSettingsMiddleware', 'django.middleware.doc.XViewMiddleware', ) @@ -117,6 +118,7 @@ INSTALLED_APPS = ( # REPOSITORY_PATH = '/Users/zuber/Projekty/platforma/files/books' IMAGE_DIR = 'images' +EDITOR_COOKIE_NAME = 'options' try: from localsettings import * diff --git a/project/static/js/editor.js b/project/static/js/editor.js index f6556578..585f3ce2 100644 --- a/project/static/js/editor.js +++ b/project/static/js/editor.js @@ -148,7 +148,8 @@ Editor.prototype.loadConfig = function() { panels: [ {name: 'htmleditor', ratio: 0.5}, {name: 'gallery', ratio: 0.5} - ] + ], + lastUpdate: 0, } try { @@ -200,6 +201,7 @@ Editor.prototype.savePanelOptions = function() { }) }); self.options.panels = panels; + self.options.lastUpdate = (new Date()).getTime() / 1000; $.log($.toJSON(self.options)); $.cookie('options', $.toJSON(self.options), { expires: 7, path: '/'}); } diff --git a/project/urls.py b/project/urls.py index 551f2e07..ec919ae3 100644 --- a/project/urls.py +++ b/project/urls.py @@ -32,7 +32,7 @@ urlpatterns = patterns('', # Authorization url(r'^accounts/login/$', 'django.contrib.auth.views.login', {'redirect_field_name': 'next'}), - url(r'^accounts/logout$', 'django.contrib.auth.views.logout', {'next_page': '/'}), + url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', {'next_page': '/'}), )