Merge branch 'master' of git@stigma.nowoczesnapolska.org.pl:platforma
authorzuber <marek@stepniowski.com>
Wed, 2 Sep 2009 10:46:45 +0000 (12:46 +0200)
committerzuber <marek@stepniowski.com>
Wed, 2 Sep 2009 10:46:45 +0000 (12:46 +0200)
Conflicts:
apps/explorer/views.py

apps/explorer/fields.py [new file with mode: 0644]
apps/explorer/middleware.py [new file with mode: 0644]
apps/explorer/models.py
apps/explorer/views.py
project/settings.py
project/static/js/editor.js
project/urls.py

diff --git a/apps/explorer/fields.py b/apps/explorer/fields.py
new file mode 100644 (file)
index 0000000..5d03e68
--- /dev/null
@@ -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 (file)
index 0000000..661a7a6
--- /dev/null
@@ -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
index 9a5e0ff..e47c26f 100644 (file)
@@ -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
index 3ab7e67..79160f8 100644 (file)
@@ -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
 #
index e958113..3bfc7db 100644 (file)
@@ -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 *
index f655657..585f3ce 100644 (file)
@@ -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: '/'});
 }
index 551f2e0..ec919ae 100644 (file)
@@ -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': '/'}),
 )