Widok do edycji dokumentów w aplikacji wiki.
[redakcja.git] / apps / api / forms.py
index af1b6b5..22cadb9 100644 (file)
@@ -4,26 +4,42 @@ __author__= "Łukasz Rekucki"
 __date__ = "$2009-09-20 21:34:52$"
 __doc__ = "Micro-forms for the API."
 
-
 from django import forms
+from api.models import PullRequest
+from django.contrib.auth.models import User
 
+import re
+from django.utils import simplejson as json
 
 class MergeRequestForm(forms.Form):
     # should the target document revision be updated or shared
     type = forms.ChoiceField(choices=(('update', 'Update'), ('share', 'Share')) )
-
-    # which revision to update/share
-    target_revision = forms.RegexField('[0-9a-f]{40}')
+    
+    #
+    # if type == update:
+    #   * user's revision which is the base of the merge
+    # if type == share:
+    #   * revision which will be pulled to the main branch
+    #
+    # NOTE: the revision doesn't have to be owned by the user
+    #  who requests the merge:
+    #   a) Every user can update his branch
+    #   b) Some users can push their changes
+    #     -> if they can't, they leave a PRQ
+    #   c) Some users can pull other people's changes
+    #   d) Some users can update branches owned by special
+    #    users associated with PRQ's
+    revision = forms.RegexField('[0-9a-f]{40}')
 
     # any additional comments that user wants to add to the change
-    comment = forms.CharField(required=False)
+    message = forms.CharField(required=False)
 
 class DocumentUploadForm(forms.Form):
     ocr_file = forms.FileField(label='Source OCR file', required=False)
     ocr_data = forms.CharField(widget=forms.HiddenInput(), required=False)
     
     bookname = forms.RegexField(regex=r'[0-9\.\w_-]+',  \
-        label='Publication name', help_text='Example: slowacki-beniowski')
+        label='Publication name', help_text='Example: słowacki__beniowski__pieśń_1')
     
     generate_dc = forms.BooleanField(required=False, \
         initial=True, label=u"Generate DublinCore template")
@@ -39,4 +55,89 @@ class DocumentUploadForm(forms.Form):
             raise forms.ValidationError(
                 "You must either provide file descriptor or raw data." )
 
-        return clean_data
\ No newline at end of file
+        return clean_data
+
+PRQ_USER_RE = re.compile(r"^\$prq-(\d{1,10})$", re.UNICODE)
+
+class DocumentRetrieveForm(forms.Form):    
+    revision = forms.RegexField(regex=r'latest|[0-9a-z]{40}', required=False)
+    user = forms.CharField(required=False)
+        
+    def clean_user(self):
+        # why, oh why doesn't django implement this!!!
+        # value = super(DocumentRetrieveForm, self).clean_user()
+        value = self.cleaned_data['user']        
+        
+        if value.startswith('$'):
+            # library user (... maybe later)
+            if value == '$library':
+                raise forms.ValidationError("Invalid user name '%s'" % value)
+
+            m = PRQ_USER_RE.match(value)
+            
+            if m:
+                try:
+                    return value
+                except:
+                    raise forms.ValidationError("User doesn't exist.")
+            raise forms.ValidationError("Invalid user name '%s'" % value)
+        try:
+            return value
+        except:
+            raise forms.ValidationError("User doesn't exist.")                
+           
+
+class TextRetrieveForm(DocumentRetrieveForm):
+    chunk = forms.CharField(required=False)
+    format = forms.CharField(required=False)
+
+    def clean_format(self):
+        value = self.cleaned_data['format']
+        if not value:
+            return 'raw'
+
+        if value not in ('nl', 'raw'):
+            raise forms.ValidationError("Invalid text format")
+        return value
+
+class TextUpdateForm(DocumentRetrieveForm):
+    message = forms.CharField(required=False)
+    contents = forms.CharField(required=False)
+    chunks = forms.CharField(required=False)
+
+    format = forms.CharField(required=False)
+
+    def clean_format(self):
+        value = self.cleaned_data['format']
+        if not value:
+            return 'raw'
+
+        if value not in ('nl', 'raw'):
+            raise forms.ValidationError("Invalid text format")
+        return value
+
+    def clean_message(self):
+        value = self.cleaned_data['message']
+
+        if value:
+            return u"$USER$ " + value
+        else:
+            return u"$AUTO$ XML content update."
+
+    def clean_chunks(self):
+        value = self.cleaned_data['chunks']
+
+        try:
+            return json.loads(value)
+        except Exception, e:
+            forms.ValidationError("Invalid JSON: " + e.message)
+
+
+    def clean(self):
+        if self.cleaned_data['contents'] and self.cleaned_data['chunks']:
+            raise forms.ValidationError("Pass either contents or chunks - not both ")
+
+        if not self.cleaned_data['contents'] and not self.cleaned_data['chunks']:
+            raise forms.ValidationError("You must pass contents or chunks.")
+
+        return self.cleaned_data
\ No newline at end of file