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