src/cm/views/create.py
changeset 0 40c8f766c9b8
child 106 36165e7cd1f0
equal deleted inserted replaced
-1:000000000000 0:40c8f766c9b8
       
     1 from cm.cm_settings import VALID_EMAIL_FOR_PUBLISH, SITE_NAME
       
     2 from cm.converters import convert_from_mimetype
       
     3 from cm.converters.pandoc_converters import pandoc_convert
       
     4 from cm.models import Text, TextVersion, Attachment
       
     5 from cm.utils.files import remove_extension
       
     6 from cm.utils.mail import EmailMessage
       
     7 from cm.views import get_text_by_keys_or_404
       
     8 from django import forms
       
     9 from cm.message import display_message
       
    10 from django.conf import settings
       
    11 from django.core.urlresolvers import reverse
       
    12 from django.forms import ModelForm
       
    13 from django.forms.util import ErrorList
       
    14 from django.http import HttpResponse, HttpResponseRedirect
       
    15 from django.shortcuts import render_to_response
       
    16 from django.template import RequestContext
       
    17 from django.template.loader import render_to_string
       
    18 from django.utils.translation import ugettext as _, ugettext_lazy
       
    19 from mimetypes import guess_type
       
    20 from cm.activity import register_activity
       
    21 from cm.security import has_global_perm
       
    22 import os
       
    23 
       
    24 class CreateTextUploadForm(ModelForm):
       
    25     file = forms.FileField(required=False,
       
    26                            label=ugettext_lazy("Upload file (optional)"),
       
    27                            help_text=ugettext_lazy("Upload a file from your computer instead of using the direct input above"),)
       
    28 
       
    29     title = forms.CharField(required=False,
       
    30                                   label=ugettext_lazy("Title"))
       
    31     class Meta:
       
    32         model = TextVersion
       
    33         fields = ('title', 'format', 'tags') #, 'note'
       
    34 
       
    35     def clean(self):
       
    36         cleaned_data = self.cleaned_data
       
    37         if not cleaned_data.get('file', None) :
       
    38             msg = _("You should specify a file to upload.")
       
    39             self._errors["file"] = ErrorList([msg])
       
    40               
       
    41         return cleaned_data
       
    42 
       
    43 class CreateTextContentForm(ModelForm):
       
    44     title = forms.CharField(required=True,
       
    45                             label=ugettext_lazy("Title"),
       
    46                             help_text=ugettext_lazy("The title of your text"),
       
    47                             widget=forms.TextInput)
       
    48     
       
    49     class Meta:
       
    50         model = TextVersion
       
    51         fields = ('title', 'format', 'content','tags') #, 'note'
       
    52 
       
    53 @has_global_perm('can_create_text')
       
    54 def text_create_content(request):
       
    55     return _text_create_content(request, CreateTextContentForm)
       
    56     
       
    57 def redirect_post_create(text) :
       
    58     return HttpResponseRedirect(reverse('text-view', args=[text.key]))
       
    59 
       
    60 def _text_create_content(request, createForm):
       
    61 #    CreateForm = CreateTextContentForm
       
    62     document = ""
       
    63         
       
    64     if request.method == 'POST':
       
    65         form = createForm(request.POST)
       
    66         if form.is_valid():
       
    67                 text = create_text(request.user, form.cleaned_data)
       
    68                 
       
    69                 register_activity(request, "text_created", text)
       
    70                 
       
    71                 display_message(request, _(u'Text "%(text_title)s" has been created' %{"text_title":text.get_latest_version().title}))
       
    72                 return redirect_post_create(text)
       
    73     else:
       
    74         form = createForm()
       
    75         
       
    76     return render_to_response('site/text_create_content.html', {'document':document, 'form' : form}, context_instance=RequestContext(request))
       
    77 
       
    78 def _text_create_upload(request, createForm):
       
    79     
       
    80 #    CreateForm = CreateTextUploadForm if request.user.is_authenticated() else CreateTextUploadFormAnon
       
    81 
       
    82     if request.method == 'POST':
       
    83         form = createForm(request.POST, request.FILES)
       
    84         if form.is_valid():
       
    85             # should convert?
       
    86             if form.cleaned_data['file']:
       
    87                 try:
       
    88                     uploaded_file = form.cleaned_data['file']
       
    89                     content, attachs = convert_from_mimetype(uploaded_file.temporary_file_path(),
       
    90                                                     uploaded_file.content_type,
       
    91                                                     format=form.cleaned_data['format'],
       
    92                                                     )
       
    93                     form.cleaned_data['content'] = content
       
    94                     form.cleaned_data['attachs'] = attachs
       
    95                     
       
    96                     # set title if not present
       
    97                     if not form.cleaned_data.get('title', None):
       
    98                         form.cleaned_data['title'] = remove_extension(uploaded_file.name)
       
    99                         
       
   100                     del form.cleaned_data['file']
       
   101                 except:
       
   102                     raise
       
   103                 
       
   104             text = create_text(request.user, form.cleaned_data)
       
   105             
       
   106             register_activity(request, "text_created", text)
       
   107             
       
   108             display_message(request, _(u'Text "%(text_title)s" has been created' %{"text_title":text.get_latest_version().title}))
       
   109             return redirect_post_create(text)
       
   110 
       
   111     else:
       
   112         form = createForm()
       
   113         
       
   114     return render_to_response('site/text_create_upload.html', {'form' : form}, context_instance=RequestContext(request))
       
   115 
       
   116 @has_global_perm('can_create_text')
       
   117 def text_create_upload(request):
       
   118     return _text_create_upload(request, CreateTextUploadForm)
       
   119 
       
   120 def create_text(user, data):
       
   121     text_content = data['content']
       
   122     text = Text.objects.create_text(title=data['title'],
       
   123                                     format=data['format'],
       
   124                                     content=text_content,
       
   125                                     note=data.get('note', None),
       
   126                                     name=data.get('name', None),
       
   127                                     email=data.get('email', None),
       
   128                                     tags=data.get('tags', None),
       
   129                                     user=user
       
   130                                     )
       
   131     text.update_denorm_fields()
       
   132     text_version = text.get_latest_version()
       
   133 
       
   134     for attach_file in data.get('attachs',  []):
       
   135         attach_data = file(attach_file, 'rb').read()
       
   136         filename = os.path.basename(attach_file)
       
   137         attachment = Attachment.objects.create_attachment(filename=filename, data=attach_data, text_version=text_version)
       
   138         attach_url = reverse('text-attach', args=[text.key, attachment.key])
       
   139         text_content = text_content.replace(filename, attach_url)
       
   140             
       
   141     # save updated (attach links) text content
       
   142     text_version.content = text_content
       
   143     text_version.save()
       
   144     return text