Move javascript for forms into separate JS file
[pgweb/local.git] / pgweb / util / helpers.py
blob6b3f08de7fdf9122d8214f9c189f43af2d5cb523
1 from django.shortcuts import render, get_object_or_404
2 from pgweb.util.contexts import render_pgweb
3 from django.http import HttpResponseRedirect, Http404
4 from django.template.loader import get_template
5 import django.utils.xmlutils
7 def simple_form(instancetype, itemid, request, formclass, formtemplate='base/form.html', redirect='/account/', navsection='account', fixedfields=None, createifempty=False):
8 if itemid == 'new':
9 instance = instancetype()
10 else:
11 # Regular form item, attempt to edit it
12 try:
13 int(itemid)
14 except ValueError:
15 raise Http404("Invalid URL")
16 if createifempty:
17 (instance, wascreated) = instancetype.objects.get_or_create(pk=itemid)
18 else:
19 instance = get_object_or_404(instancetype, pk=itemid)
20 if hasattr(instance, 'submitter'):
21 if not instance.submitter == request.user:
22 raise Exception("You are not the owner of this item!")
23 elif hasattr(instance, 'verify_submitter'):
24 if not instance.verify_submitter(request.user):
25 raise Exception("You are not the owner of this item!")
27 if request.method == 'POST':
28 # Process this form
29 form = formclass(data=request.POST, instance=instance)
30 if form.is_valid():
31 r = form.save(commit=False)
32 r.submitter = request.user
33 # Set fixed fields. Note that this will not work if the fixed fields are ManyToMany,
34 # but we'll fix that sometime in the future
35 if fixedfields:
36 for k,v in fixedfields.items():
37 setattr(r, k, v)
38 r.save()
40 # If we have a callback with the current user
41 if hasattr(form, 'apply_submitter'):
42 form.apply_submitter(r, request.user)
43 r.save()
45 form.save_m2m()
47 return HttpResponseRedirect(redirect)
48 else:
49 # Generate form
50 form = formclass(instance=instance)
52 if hasattr(form, 'filter_by_user'):
53 form.filter_by_user(request.user)
55 for fn in form.fields:
56 if fn in getattr(instancetype, 'markdown_fields', []):
57 form.fields[fn].widget.attrs.update({'class': 'markdown-content'})
59 for togg in getattr(form, 'toggle_fields', []):
60 form.fields[togg['name']].widget.attrs.update({
61 'data-toggles': ','.join(togg['fields']),
62 'data-toggle-invert': togg['invert'] and 'true' or 'false',
63 'class': 'toggle-checkbox',
66 return render_pgweb(request, navsection, formtemplate, {
67 'form': form,
68 'formitemtype': instance._meta.verbose_name,
69 'form_intro': hasattr(form, 'form_intro') and form.form_intro or None,
70 'described_checkboxes': getattr(form, 'described_checkboxes', {}),
71 'savebutton': (itemid == "new") and "Submit New" or "Save",
72 'operation': (itemid == "new") and "New" or "Edit",
75 def template_to_string(templatename, attrs = {}):
76 return get_template(templatename).render(attrs)
78 def HttpServerError(request, msg):
79 r = render(request, 'errors/500.html', {
80 'message': msg,
82 r.status_code = 500
83 return r
86 class PgXmlHelper(django.utils.xmlutils.SimplerXMLGenerator):
87 def __init__(self, outstream, skipempty=False):
88 django.utils.xmlutils.SimplerXMLGenerator.__init__(self, outstream, 'utf-8')
89 self.skipempty = skipempty
91 def add_xml_element(self, name, value):
92 if self.skipempty and value=='': return
93 self.startElement(name, {})
94 self.characters(value)
95 self.endElement(name)