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

1  2 
apps/explorer/views.py
project/static/js/editor.js

diff --combined apps/explorer/views.py
@@@ -1,19 -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 lxml import etree
- from librarian import html,dcparser
++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
  #
@@@ -84,21 -89,28 +83,28 @@@ def file_upload(request, repo)
  @with_repo
  def file_xml(request, repo, path):
      if request.method == 'POST':
+         errors = None
          form = forms.BookForm(request.POST)
          if form.is_valid():
              print 'Saving whole text.', request.user.username
              def save_action():
                  print 'In branch: ' + repo.repo[None].branch()
                  repo._add_file(path, form.cleaned_data['content'])                
-                 repo._commit(message=(form.cleaned_data['commit_message'] or 'Lokalny zapis platformy.'), user=request.user.username)
+                 repo._commit(message=(form.cleaned_data['commit_message'] or 'Lokalny zapis platformy.'),\
+                      user=request.user.username)
+             try:
+                 # wczytaj dokument z ciągu znaków -> weryfikacja
+                 document = parser.WLDocument.from_string(form.cleaned_data['content'])
  
-             print repo.in_branch(save_action, models.user_branch(request.user) );
-             result = "ok"
-         else:
-             result = "error"
+                 #  save to user's branch
+                 repo.in_branch(save_action, models.user_branch(request.user) );
+             except (ParseError, ValidationError), e:
+                 errors = [e.message]              
  
-         errors = dict( (field[0], field[1].as_text()) for field in form.errors.iteritems() )
-         return HttpResponse( json.dumps({'result': result, 'errors': errors}) );
+         if not errors:
+             errors = dict( (field[0], field[1].as_text()) for field in form.errors.iteritems() )
+         return HttpResponse(json.dumps({'result': errors and 'error' or 'ok', 'errors': errors}));
  
      form = forms.BookForm()
      data = repo.get_file(path, models.user_branch(request.user))
  @ajax_login_required
  @with_repo
  def file_dc(request, path, repo):
+     errors = None
      if request.method == 'POST':
          form = forms.DublinCoreForm(request.POST)
          
          if form.is_valid():
              def save_action():
                  file_contents = repo._get_file(path)
-                 doc = etree.fromstring(file_contents)
-                 book_info = dcparser.BookInfo()
-                 for name, value in form.cleaned_data.items():
-                     if value is not None and value != '':
-                         setattr(book_info, name, value)
-                 rdf = etree.XML(book_info.to_xml())
-                 old_rdf = doc.getroottree().find('//{http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF')
-                 old_rdf.getparent().remove(old_rdf)
-                 doc.insert(0, rdf)
-                 repo._add_file(path, etree.tostring(doc, pretty_print=True, encoding=unicode))
-                 repo._commit(message=(form.cleaned_data['commit_message'] or 'Lokalny zapis platformy.'), user=request.user.username)
  
-             repo.in_branch(save_action, models.user_branch(request.user) )
-             result = "ok"
-         else:
-             result = "error" 
-         errors = dict( (field[0], field[1].as_text()) for field in form.errors.iteritems() )
-         return HttpResponse( json.dumps({'result': result, 'errors': errors}) );
+                 # wczytaj dokument z repozytorium
+                 document = parser.WLDocument.from_string(file_contents)                    
+                 document.book_info.update(form.cleaned_data)
+                 
+                 print "SAVING DC"
+                 # zapisz
+                 repo._add_file(path, document.serialize())
+                 repo._commit( \
+                     message=(form.cleaned_data['commit_message'] or 'Lokalny zapis platformy.'), \
+                     user=request.user.username )
+                 
+             try:
+                 repo.in_branch(save_action, models.user_branch(request.user) )
+             except (ParseError, ValidationError), e:
+                 errors = [e.message]
+         if errors is None:
+             errors = ["Pole '%s': %s\n" % (field[0], field[1].as_text()) for field in form.errors.iteritems()]
+         return HttpResponse( json.dumps({'result': errors and 'error' or 'ok', 'errors': errors}) );
      
-     fulltext = repo.get_file(path, models.user_branch(request.user))
-     form = forms.DublinCoreForm(text=fulltext)       
-     return HttpResponse( json.dumps({'result': 'ok', 'content': fulltext}) ) 
+     # this is unused currently, but may come in handy 
+     content = []
+     
+     try:
+         fulltext = repo.get_file(path, models.user_branch(request.user))
+         bookinfo = dcparser.BookInfo.from_string(fulltext)
+         content = bookinfo.to_dict()
+     except (ParseError, ValidationError), e:
+         errors = [e.message]
+     return HttpResponse( json.dumps({'result': errors and 'error' or 'ok', 
+         'errors': errors, 'content': content }) ) 
  
  # Display the main editor view
  
@@@ -176,24 -199,34 +193,34 @@@ def gallery_panel(request, path)
  @with_repo
  def htmleditor_panel(request, path, repo):
      user_branch = models.user_branch(request.user)
-     return direct_to_template(request, 'explorer/panels/htmleditor.html', extra_context={
-         'fpath': path,
-         'html': html.transform(repo.get_file(path, user_branch), is_file=False),
-     })
-  
+     try:
+         return direct_to_template(request, 'explorer/panels/htmleditor.html', extra_context={
+             'fpath': path,
+             'html': html.transform(repo.get_file(path, user_branch), is_file=False),
+         })
+     except (ParseError, ValidationError), e:
+         return direct_to_template(request, 'explorer/panels/parse_error.html', extra_context={
+             'fpath': path, 'exception_type': type(e).__name__, 'exception': e, 'panel_name': 'Edytor HTML'}) 
  
  @ajax_login_required
  @with_repo
  def dceditor_panel(request, path, repo):
      user_branch = models.user_branch(request.user)
-     text = repo.get_file(path, user_branch)
-     form = forms.DublinCoreForm(text=text)       
-     return direct_to_template(request, 'explorer/panels/dceditor.html', extra_context={
-         'fpath': path,
-         'form': form,
-     })
  
+     try:
+         doc_text = repo.get_file(path, user_branch)
+         document = parser.WLDocument.from_string(doc_text)
+         form = forms.DublinCoreForm(info=document.book_info)       
+         return direct_to_template(request, 'explorer/panels/dceditor.html', extra_context={
+             'fpath': path,
+             'form': form,
+         })
+     except (ParseError, ValidationError), e:
+         return direct_to_template(request, 'explorer/panels/parse_error.html', extra_context={
+             'fpath': path, 'exception_type': type(e).__name__, 'exception': e, 
+             'panel_name': 'Edytor DublinCore'}) 
  
  # =================
  # = Utility views =
@@@ -121,7 -121,7 +121,7 @@@ Editor.prototype.setupUI = function() 
        $('#panels > *.panel-wrap').each(function() {
                var panelWrap = $(this);
                $.log('wrap: ', panelWrap);
-               panel = new Panel(panelWrap);
+               var panel = new Panel(panelWrap);
                panelWrap.data('ctrl', panel); // attach controllers to wraps
          panel.load($('.panel-toolbar select', panelWrap).val());
          
              panelWrap.data('ctrl').load(url);
              self.savePanelOptions();
          });
+         $('.panel-toolbar button.refresh-button', panelWrap).click(
+             function() { panel.refresh(); } );            
      });
  
        $(document).bind('panel:contentChanged', function() { self.onContentChanged.apply(self, arguments) });
@@@ -145,8 -148,7 +148,8 @@@ Editor.prototype.loadConfig = function(
          panels: [
              {name: 'htmleditor', ratio: 0.5},
              {name: 'gallery', ratio: 0.5}
 -        ]
 +        ],
 +        lastUpdate: 0,
      }
      
      try {
@@@ -198,7 -200,6 +201,7 @@@ Editor.prototype.savePanelOptions = fun
          })
      });
      self.options.panels = panels;
 +    self.options.lastUpdate = (new Date()).getTime() / 1000;
      $.log($.toJSON(self.options));
      $.cookie('options', $.toJSON(self.options), { expires: 7, path: '/'});
  }
@@@ -222,20 -223,21 +225,21 @@@ Editor.prototype.saveToBranch = functio
        }
  
        saveInfo = changed_panel.data('ctrl').saveInfo();
-         var postData = ''
-         if(saveInfo.postData instanceof Object)
-             postData = $.param(saveInfo.postData);
-         else
-             postData = saveInfo.postData;
+     var postData = ''
+     
+     if(saveInfo.postData instanceof Object)
+         postData = $.param(saveInfo.postData);
+     else
+         postData = saveInfo.postData;
  
-         postData += '&' + $.param({'commit_message': msg})
+     postData += '&' + $.param({'commit_message': msg})
  
        $.ajax({
                url: saveInfo.url,
                dataType: 'json',
                success: function(data, textStatus) {
                        if (data.result != 'ok')
-                               $.log('save errors: ', data.errors)
+                               self.showPopup('save-error', data.errors[0]);
                        else {
                                self.refreshPanels(changed_panel);
                  $('#toolbar-button-save').attr('disabled', 'disabled');
@@@ -309,30 -311,37 +313,37 @@@ Editor.prototype.sendPullRequest = func
        }); */
  }
  
- Editor.prototype.showPopup = function(name) 
+ Editor.prototype.showPopup = function(name, text
  {
      var self = this;
-     self.popupQueue.push(name)
+     self.popupQueue.push( [name, text] )
  
      if( self.popupQueue.length > 1) 
          return;
  
-     $('#message-box > #' + name).fadeIn();
+     var box = $('#message-box > #' + name);
+     $('*.data', box).html(text);
+     box.fadeIn();
   
-    self._nextPopup = function() {
+     self._nextPopup = function() {
          var elem = self.popupQueue.pop()
          if(elem) {
-             elem = $('#message-box > #' + elem);
-             elem.fadeOut(300, function() {
-                 if( self.popupQueue.length > 0) 
-                     $('#message-box > #' + self.popupQueue[0]).fadeIn();
-                     setTimeout(self._nextPopup, 1700);
-             });
+             var box = $('#message-box > #' + elem[0]);
  
+             box.fadeOut(300, function() {
+                 $('*.data', box).html();
+     
+                 if( self.popupQueue.length > 0) {
+                     box = $('#message-box > #' + self.popupQueue[0][0]);
+                     $('*.data', box).html(self.popupQueue[0][1]);
+                     box.fadeIn();
+                     setTimeout(self._nextPopup, 5000);
+                 }
+             });
          }
      }
  
-     setTimeout(self._nextPopup, 2000);
+     setTimeout(self._nextPopup, 5000);
  }