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):
9 instance
= instancetype()
11 # Regular form item, attempt to edit it
15 raise Http404("Invalid URL")
17 (instance
, wascreated
) = instancetype
.objects
.get_or_create(pk
=itemid
)
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':
29 form
= formclass(data
=request
.POST
, instance
=instance
)
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
36 for k
,v
in fixedfields
.items():
40 # If we have a callback with the current user
41 if hasattr(form
, 'apply_submitter'):
42 form
.apply_submitter(r
, request
.user
)
47 return HttpResponseRedirect(redirect
)
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
, {
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', {
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
)