├── .gitignore ├── AUTHORS ├── LICENSE ├── MANIFEST.in ├── README.rst ├── form_designer ├── __init__.py ├── admin.py ├── contrib │ ├── __init__.py │ ├── cms_plugins │ │ ├── __init__.py │ │ └── form_designer_form │ │ │ ├── __init__.py │ │ │ ├── cms_plugins.py │ │ │ └── models.py │ └── exporters │ │ ├── __init__.py │ │ ├── csv_exporter.py │ │ └── xls_exporter.py ├── fields.py ├── forms.py ├── locale │ ├── de │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── en │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── fi │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── nl │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ └── pt_BR │ │ └── LC_MESSAGES │ │ ├── django.mo │ │ └── django.po ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto__chg_field_formdefinitionfield_initial.py │ ├── 0003_auto__add_field_formdefinition_display_logged.py │ ├── 0004_auto__add_field_formdefinition_body.py │ ├── 0005_auto__add_field_formdefinition_require_hash__add_field_formdefinition_.py │ ├── 0006_auto__add_field_formdefinition_save_uploaded_files.py │ ├── 0007_auto__add_field_formdefinition_mail_uploaded_files.py │ ├── 0008_auto__add_formvalue__del_field_formlog_data__add_field_formlog_created.py │ ├── 0009_set_data_to_form_log.py │ └── __init__.py ├── models.py ├── settings.py ├── signals.py ├── static │ └── form_designer │ │ └── js │ │ ├── jquery-inline-collapsible.js │ │ ├── jquery-inline-fieldset-collapsible.js │ │ ├── jquery-inline-positioning.js │ │ ├── jquery-inline-prepopulate-label.js │ │ ├── jquery-inline-rename.js │ │ ├── jquery-ui.js │ │ ├── jquery-url-param.js │ │ └── jquery.js ├── templates │ ├── admin │ │ └── form_designer │ │ │ └── formlog │ │ │ └── change_list.html │ ├── html │ │ └── formdefinition │ │ │ ├── base.html │ │ │ ├── data_message.html │ │ │ ├── detail.html │ │ │ └── forms │ │ │ ├── as_p.html │ │ │ ├── as_table.html │ │ │ ├── as_table_h.html │ │ │ ├── as_ul.html │ │ │ ├── custom.html │ │ │ └── includes │ │ │ └── submit.html │ └── txt │ │ └── formdefinition │ │ └── data_message.txt ├── templatetags │ ├── __init__.py │ ├── friendly.py │ └── widget_type.py ├── uploads.py ├── urls.py ├── utils.py └── views.py ├── requirements.txt └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .* 3 | dist 4 | MANIFEST 5 | 6 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | AUTHORS AND MAINTAINERS 2 | 3 | MAIN DEVELOPERS: 4 | Samuel Luescher (samluescher) 5 | 6 | CONTRIBUTORS (in chronological order): 7 | Jannis Leidel (jezdez) 8 | Simon Charette (charettes) 9 | William Dangerfield (dangerfield) 10 | kinea 11 | John-Scott Atlakson (jsma) 12 | Diederik van der Boor (vdboor) 13 | Jeremy Self (finder) 14 | sbnoemi 15 | Patrick Taylor (huxley) 16 | keysen 17 | ruhan 18 | Dries Desmet (driesdesmet) 19 | DeeJayPee 20 | 7mp 21 | Evan Borgstrom (borgstrom) 22 | Ceesjan Luiten (quinox) 23 | Jordi Llonch (llonchj) 24 | Aarni Koskela (akx) 25 | Abdourakhmane Ripault (aert) 26 | Estuans (estuans) 27 | bloynd 28 | mrmachine (Tai Lee) 29 | Ben Waters (the-ben-waters) 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2009, Samuel Luescher 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are 6 | met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | * Redistributions in binary form must reproduce the above 11 | copyright notice, this list of conditions and the following 12 | disclaimer in the documentation and/or other materials provided 13 | with the distribution. 14 | * Neither the name of the author nor the names of other 15 | contributors may be used to endorse or promote products derived 16 | from this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include AUTHORS 2 | include README.rst 3 | include LICENSE 4 | recursive-include form_designer/templates *.html *.txt 5 | recursive-include form_designer/static *.js 6 | recursive-include form_designer/locale *.po *.mo 7 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Django Form Designer 2 | ******************** 3 | 4 | A Django admin app with a GUI to create complex forms without any programming skills; 5 | complete with logging, validation, and redirects. 6 | 7 | **Key features**: 8 | 9 | * Design contact forms, search forms etc from the Django admin, without writing any code 10 | * Form data can be logged and CSV-exported, sent via e-mail, or forwarded to any web address 11 | * Integration with `Django CMS `_: Add forms to any page 12 | * Use drag & drop to change the position of your form fields 13 | * Fully collapsible admin interface for better overview over your form 14 | * Implements many form fields included with Django (TextField, EmailField, DateField etc) 15 | * Validation rules as supplied by Django are fully configurable (maximum length, regular 16 | expression etc) 17 | * Customizable messages and labels 18 | * Supports POST and GET forms 19 | * Signals on form render, submission, success, error. 20 | 21 | 22 | Installation 23 | ============ 24 | 25 | This install guide assumes that you are familiar with Python and Django. 26 | 27 | - Install the module using pip:: 28 | 29 | $ pip install git+git://github.com/philomat/django-form-designer.git#egg=django-form-designer 30 | 31 | **or** download it from http://github.com/philomat/django-form-designer, and run the installation 32 | script:: 33 | 34 | $ python setup.py install 35 | 36 | 37 | Basic setup 38 | =========== 39 | 40 | - Add ``form_designer`` to your ``INSTALLED_APPS`` setting:: 41 | 42 | INSTALLED_APPS = ( 43 | ... 44 | 'form_designer', 45 | ) 46 | 47 | - Set up the database tables using:: 48 | 49 | $ manage.py syncdb 50 | 51 | **or**, if you are using South:: 52 | 53 | $ manage.py migrate form_designer 54 | 55 | - If you are using ``django.contrib.staticfiles`` (recommended), just run the 56 | usual command to collect static files:: 57 | 58 | $ python manage.py collectstatic 59 | 60 | .. Note:: 61 | Please refer to the Django documentation on how to `set up the static files 62 | app `_ if 63 | you have not done that yet. 64 | 65 | If you are **not** going to use the ``staticfiles`` app, you will have to copy 66 | the contents of the ``static`` folder to the location you are serving static 67 | files from. 68 | 69 | - Add the URLs to your URL conf. For instance, in order to make a form named 70 | ``example-form`` available under ``http://domain.com/forms/example-form``, 71 | add the following line to your project's ``urls.py``:: 72 | 73 | urlpatterns = patterns('', 74 | (r'^forms/', include('form_designer.urls')), 75 | ... 76 | ) 77 | 78 | .. Note:: 79 | If you are using the form_designer plugin for Django CMS for making forms 80 | public, this step is not necessary. 81 | 82 | 83 | Using Django Form Designer with Django CMS 84 | ========================================== 85 | 86 | - Add ``form_designer.contrib.cms_plugins.form_designer_form`` to your ``INSTALLED_APPS`` 87 | setting:: 88 | 89 | INSTALLED_APPS = ( 90 | ... 91 | 'form_designer.contrib.cms_plugins.form_designer_form', 92 | ) 93 | 94 | - Set up the database tables using:: 95 | 96 | $ manage.py syncdb 97 | 98 | You can now add forms to pages created with Django CMS. 99 | 100 | 101 | Optional requirements 102 | ===================== 103 | 104 | The form_designer admin interface requires jQuery and the jQuery UI Sortable 105 | plugin to make building forms a lot more user-friendly. The two Javascript 106 | files are bundled with form_designer. If you want to use you own jquery.js 107 | instead because you're already including it anyway, define JQUERY\_JS in your 108 | settings file. For instance:: 109 | 110 | JQUERY_JS = 'jquery/jquery-latest.js' 111 | -------------------------------------------------------------------------------- /form_designer/__init__.py: -------------------------------------------------------------------------------- 1 | try: 2 | from south.modelsinspector import add_introspection_rules 3 | except ImportError: 4 | pass 5 | else: 6 | add_introspection_rules([], ['^form_designer\.pickled_object_field\.PickledObjectField']) 7 | add_introspection_rules([], ['^form_designer\.model_name_field\.ModelNameField']) 8 | add_introspection_rules([], ['^form_designer\.template_field\.TemplateCharField']) 9 | add_introspection_rules([], ['^form_designer\.template_field\.TemplateTextField']) 10 | -------------------------------------------------------------------------------- /form_designer/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.utils.translation import ugettext_lazy as _, ugettext 3 | from django.conf.urls import patterns, url 4 | from django.contrib.admin.views.main import ChangeList 5 | from django.http import Http404 6 | 7 | from form_designer.forms import FormDefinitionForm, FormDefinitionFieldInlineForm 8 | from form_designer.models import FormDefinition, FormDefinitionField, FormLog, FormValue 9 | from form_designer import settings 10 | from form_designer.utils import get_class 11 | 12 | 13 | class FormDefinitionFieldInline(admin.StackedInline): 14 | form = FormDefinitionFieldInlineForm 15 | model = FormDefinitionField 16 | extra = 1 17 | fieldsets = [ 18 | (_('Basic'), {'fields': ['name', 'field_class', 'required', 'initial']}), 19 | (_('Display'), {'fields': ['label', 'widget', 'help_text', 'position', 'include_result']}), 20 | (_('Text'), {'fields': ['max_length', 'min_length']}), 21 | (_('Numbers'), {'fields': ['max_value', 'min_value', 'max_digits', 'decimal_places']}), 22 | (_('Regex'), {'fields': ['regex']}), 23 | (_('Choices'), {'fields': ['choice_values', 'choice_labels']}), 24 | (_('Model Choices'), {'fields': ['choice_model', 'choice_model_empty_label']}), 25 | ] 26 | 27 | 28 | class FormDefinitionAdmin(admin.ModelAdmin): 29 | fieldsets = [ 30 | (_('Basic'), {'fields': ['name', 'require_hash', 'method', 'action', 'title', 'body']}), 31 | (_('Settings'), {'fields': ['allow_get_initial', 'log_data', 'success_redirect', 'success_clear', 'display_logged', 'save_uploaded_files'], 'classes': ['collapse']}), 32 | (_('Mail form'), {'fields': ['mail_to', 'mail_from', 'mail_subject', 'mail_uploaded_files'], 'classes': ['collapse']}), 33 | (_('Templates'), {'fields': ['message_template', 'form_template_name'], 'classes': ['collapse']}), 34 | (_('Messages'), {'fields': ['success_message', 'error_message', 'submit_label'], 'classes': ['collapse']}), 35 | ] 36 | list_display = ('name', 'title', 'method', 'count_fields') 37 | form = FormDefinitionForm 38 | inlines = [ 39 | FormDefinitionFieldInline, 40 | ] 41 | 42 | 43 | class FormLogAdmin(admin.ModelAdmin): 44 | list_display = ('form_no_link', 'created', 'id', 'created_by', 'data_html') 45 | list_filter = ('form_definition',) 46 | list_display_links = () 47 | date_hierarchy = 'created' 48 | 49 | exporter_classes = {} 50 | exporter_classes_ordered = [] 51 | for class_path in settings.EXPORTER_CLASSES: 52 | cls = get_class(class_path) 53 | if cls.is_enabled(): 54 | exporter_classes[cls.export_format()] = cls 55 | exporter_classes_ordered.append(cls) 56 | 57 | def get_exporter_classes(self): 58 | return self.__class__.exporter_classes_ordered 59 | 60 | def get_actions(self, request): 61 | actions = super(FormLogAdmin, self).get_actions(request) 62 | 63 | for cls in self.get_exporter_classes(): 64 | desc = _("Export selected %%(verbose_name_plural)s as %s") % cls.export_format() 65 | actions[cls.export_format()] = (cls.export_view, cls.export_format(), desc) 66 | 67 | return actions 68 | 69 | # Disabling all edit links: Hack as found at http://stackoverflow.com/questions/1618728/disable-link-to-edit-object-in-djangos-admin-display-list-only 70 | def form_no_link(self, obj): 71 | return ''+obj.form_definition.__unicode__()+'' 72 | form_no_link.admin_order_field = 'form_definition' 73 | form_no_link.allow_tags = True 74 | form_no_link.short_description = _('Form') 75 | 76 | def get_urls(self): 77 | urls = patterns('', 78 | url(r'^export/(?P[a-zA-Z0-9_-]+)/$', self.admin_site.admin_view(self.export_view), name='form_designer_export'), 79 | ) 80 | return urls + super(FormLogAdmin, self).get_urls() 81 | 82 | def data_html(self, obj): 83 | return obj.form_definition.compile_message(obj.data, 'html/formdefinition/data_message.html') 84 | data_html.allow_tags = True 85 | data_html.short_description = _('Data') 86 | 87 | def get_change_list_query_set(self, request, extra_context=None): 88 | """ 89 | The 'change list' admin view for this model. 90 | """ 91 | list_display = self.get_list_display(request) 92 | list_display_links = self.get_list_display_links(request, list_display) 93 | list_filter = self.get_list_filter(request) 94 | ChangeList = self.get_changelist(request) 95 | 96 | cl = ChangeList(request, self.model, list_display, 97 | list_display_links, list_filter, self.date_hierarchy, 98 | self.search_fields, self.list_select_related, 99 | self.list_per_page, self.list_max_show_all, self.list_editable, 100 | self) 101 | return cl.get_query_set(request) 102 | 103 | def export_view(self, request, format): 104 | queryset = self.get_change_list_query_set(request) 105 | if not format in self.exporter_classes: 106 | raise Http404() 107 | return self.exporter_classes[format](self.model).export(request, queryset) 108 | 109 | def changelist_view(self, request, extra_context=None): 110 | from django.core.urlresolvers import reverse, NoReverseMatch 111 | extra_context = extra_context or {} 112 | try: 113 | query_string = '?'+request.META['QUERY_STRING'] 114 | except (TypeError, KeyError): 115 | query_string = '' 116 | 117 | exporter_links = [] 118 | for cls in self.get_exporter_classes(): 119 | url = reverse('admin:form_designer_export', args=(cls.export_format(),))+query_string 120 | exporter_links.append({'url': url, 'label': _('Export view as %s') % cls.export_format()}) 121 | 122 | extra_context['exporters'] = exporter_links 123 | 124 | return super(FormLogAdmin, self).changelist_view(request, extra_context) 125 | 126 | 127 | admin.site.register(FormDefinition, FormDefinitionAdmin) 128 | admin.site.register(FormLog, FormLogAdmin) 129 | -------------------------------------------------------------------------------- /form_designer/contrib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/contrib/__init__.py -------------------------------------------------------------------------------- /form_designer/contrib/cms_plugins/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/contrib/cms_plugins/__init__.py -------------------------------------------------------------------------------- /form_designer/contrib/cms_plugins/form_designer_form/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/contrib/cms_plugins/form_designer_form/__init__.py -------------------------------------------------------------------------------- /form_designer/contrib/cms_plugins/form_designer_form/cms_plugins.py: -------------------------------------------------------------------------------- 1 | from form_designer.contrib.cms_plugins.form_designer_form.models import CMSFormDefinition 2 | from form_designer.views import process_form 3 | from form_designer import settings 4 | 5 | from cms.plugin_base import CMSPluginBase 6 | from cms.plugin_pool import plugin_pool 7 | 8 | from django.utils.translation import ugettext as _ 9 | 10 | 11 | class FormDesignerPlugin(CMSPluginBase): 12 | model = CMSFormDefinition 13 | module = _('Form Designer') 14 | name = _('Form') 15 | admin_preview = False 16 | render_template = False 17 | 18 | def render(self, context, instance, placeholder): 19 | if instance.form_definition.form_template_name: 20 | self.render_template = instance.form_definition.form_template_name 21 | else: 22 | self.render_template = settings.DEFAULT_FORM_TEMPLATE 23 | 24 | # Redirection does not work with CMS plugin, hence disable: 25 | return process_form(context['request'], instance.form_definition, context, disable_redirection=True) 26 | 27 | 28 | plugin_pool.register_plugin(FormDesignerPlugin) 29 | -------------------------------------------------------------------------------- /form_designer/contrib/cms_plugins/form_designer_form/models.py: -------------------------------------------------------------------------------- 1 | from form_designer.models import FormDefinition 2 | from cms.models import CMSPlugin 3 | from django.db import models 4 | from django.utils.translation import ugettext_lazy as _ 5 | 6 | 7 | class CMSFormDefinition(CMSPlugin): 8 | form_definition = models.ForeignKey(FormDefinition, verbose_name=_('form')) 9 | 10 | def __unicode__(self): 11 | return self.form_definition.__unicode__() 12 | -------------------------------------------------------------------------------- /form_designer/contrib/exporters/__init__.py: -------------------------------------------------------------------------------- 1 | from form_designer import settings 2 | from form_designer.templatetags.friendly import friendly 3 | from django.db.models import Count 4 | from django.utils.translation import ugettext as _ 5 | from django.utils.encoding import smart_str 6 | 7 | 8 | class ExporterBase(object): 9 | 10 | def __init__(self, model): 11 | self.model = model 12 | 13 | @staticmethod 14 | def is_enabled(): 15 | return True 16 | 17 | @staticmethod 18 | def export_format(): 19 | raise NotImplemented() 20 | 21 | def init_writer(self): 22 | raise NotImplemented() 23 | 24 | def init_response(self): 25 | raise NotImplemented() 26 | 27 | def writerow(self, row): 28 | raise NotImplemented() 29 | 30 | def close(self): 31 | pass 32 | 33 | @classmethod 34 | def export_view(cls, modeladmin, request, queryset): 35 | return cls(modeladmin.model).export(request, queryset) 36 | 37 | def export(self, request, queryset=None): 38 | raise NotImplemented() 39 | 40 | 41 | class FormLogExporterBase(ExporterBase): 42 | 43 | def export(self, request, queryset=None): 44 | self.init_response() 45 | self.init_writer() 46 | distinct_forms = queryset.aggregate(Count('form_definition', distinct=True))['form_definition__count'] 47 | 48 | include_created = settings.CSV_EXPORT_INCLUDE_CREATED 49 | include_pk = settings.CSV_EXPORT_INCLUDE_PK 50 | include_header = settings.CSV_EXPORT_INCLUDE_HEADER and distinct_forms == 1 51 | include_form = settings.CSV_EXPORT_INCLUDE_FORM and distinct_forms > 1 52 | 53 | if queryset.count(): 54 | fields = queryset[0].form_definition.get_field_dict() 55 | if include_header: 56 | header = [] 57 | if include_form: 58 | header.append(_('Form')) 59 | if include_created: 60 | header.append(_('Created')) 61 | if include_pk: 62 | header.append(_('ID')) 63 | # Form fields might have been changed and not match 64 | # existing form logs anymore. 65 | # Hence, use current form definition for header. 66 | # for field in queryset[0].data: 67 | # header.append(field['label'] if field['label'] else field['key']) 68 | for field_name, field in fields.items(): 69 | header.append(field.label if field.label else field.key) 70 | 71 | self.writerow([smart_str(cell, encoding=settings.CSV_EXPORT_ENCODING) for cell in header]) 72 | 73 | for entry in queryset: 74 | row = [] 75 | if include_form: 76 | row.append(entry.form_definition) 77 | if include_created: 78 | row.append(entry.created) 79 | if include_pk: 80 | row.append(entry.pk) 81 | 82 | for item in entry.data: 83 | value = friendly(item['value'], null_value=settings.CSV_EXPORT_NULL_VALUE) 84 | value = smart_str( 85 | value, encoding=settings.CSV_EXPORT_ENCODING) 86 | row.append(value) 87 | 88 | self.writerow(row) 89 | 90 | self.close() 91 | return self.response 92 | -------------------------------------------------------------------------------- /form_designer/contrib/exporters/csv_exporter.py: -------------------------------------------------------------------------------- 1 | from form_designer.contrib.exporters import FormLogExporterBase 2 | from form_designer import settings 3 | from django.utils.translation import ugettext_lazy as _ 4 | from django.http import HttpResponse 5 | 6 | import csv 7 | 8 | class CsvExporter(FormLogExporterBase): 9 | 10 | @staticmethod 11 | def export_format(): 12 | return 'CSV' 13 | 14 | def init_writer(self): 15 | self.writer = csv.writer(self.response, delimiter=settings.CSV_EXPORT_DELIMITER) 16 | 17 | def init_response(self): 18 | self.response = HttpResponse(mimetype='text/csv') 19 | self.response['Content-Disposition'] = 'attachment; filename=%s.csv' % \ 20 | unicode(self.model._meta.verbose_name_plural) 21 | 22 | def writerow(self, row): 23 | self.writer.writerow(row) 24 | 25 | def export(self, request, queryset=None): 26 | return super(CsvExporter, self).export(request, queryset) 27 | -------------------------------------------------------------------------------- /form_designer/contrib/exporters/xls_exporter.py: -------------------------------------------------------------------------------- 1 | from form_designer.contrib.exporters import FormLogExporterBase 2 | from form_designer import settings 3 | from django.utils.translation import ugettext_lazy as _ 4 | from django.http import HttpResponse 5 | from django.utils.encoding import smart_unicode 6 | 7 | try: 8 | import xlwt 9 | except ImportError: 10 | XLWT_INSTALLED = False 11 | else: 12 | XLWT_INSTALLED = True 13 | 14 | 15 | class XlsExporter(FormLogExporterBase): 16 | 17 | @staticmethod 18 | def export_format(): 19 | return 'XLS' 20 | 21 | @staticmethod 22 | def is_enabled(): 23 | return XLWT_INSTALLED 24 | 25 | def init_writer(self): 26 | self.wb = xlwt.Workbook() 27 | self.ws = self.wb.add_sheet(unicode(self.model._meta.verbose_name_plural)) 28 | self.rownum = 0 29 | 30 | def init_response(self): 31 | self.response = HttpResponse(mimetype='application/ms-excel') 32 | self.response['Content-Disposition'] = 'attachment; filename=%s.xls' % \ 33 | unicode(self.model._meta.verbose_name_plural) 34 | 35 | def writerow(self, row): 36 | for i, f in enumerate(row): 37 | self.ws.write(self.rownum, i, smart_unicode(f, encoding=settings.CSV_EXPORT_ENCODING)) 38 | self.rownum += 1 39 | 40 | def close(self): 41 | self.wb.save(self.response) 42 | 43 | def export(self, request, queryset=None): 44 | return super(XlsExporter, self).export(request, queryset) 45 | -------------------------------------------------------------------------------- /form_designer/fields.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django import forms 3 | from django.core.exceptions import ValidationError 4 | from django.utils.translation import ugettext_lazy as _ 5 | 6 | 7 | class ModelNameFormField(forms.CharField): 8 | 9 | @staticmethod 10 | def get_model_from_string(model_path): 11 | try: 12 | app_label, model_name = model_path.rsplit('.models.') 13 | return models.get_model(app_label, model_name) 14 | except: 15 | return None 16 | 17 | def clean(self, value): 18 | """ 19 | Validates that the input matches the regular expression. Returns a 20 | Unicode object. 21 | """ 22 | value = super(ModelNameFormField, self).clean(value) 23 | if value == u'': 24 | return value 25 | if not ModelNameFormField.get_model_from_string(value): 26 | raise ValidationError( 27 | _('Model could not be imported: %(value)s. Please use a valid model path.'), 28 | code='invalid', 29 | params={'value': value}, 30 | ) 31 | return value 32 | 33 | class ModelNameField(models.CharField): 34 | 35 | @staticmethod 36 | def get_model_from_string(model_path): 37 | return ModelNameFormField.get_model_from_string(model_path) 38 | 39 | def formfield(self, **kwargs): 40 | # This is a fairly standard way to set up some defaults 41 | # while letting the caller override them. 42 | defaults = {'form_class': ModelNameFormField} 43 | defaults.update(kwargs) 44 | return super(ModelNameField, self).formfield(**defaults) 45 | 46 | class TemplateFormField(forms.CharField): 47 | 48 | def clean(self, value): 49 | """ 50 | Validates that the input can be compiled as a template. 51 | """ 52 | value = super(TemplateFormField, self).clean(value) 53 | from django.template import Template, TemplateSyntaxError 54 | try: 55 | Template(value) 56 | except TemplateSyntaxError, error: 57 | raise ValidationError(error) 58 | return value 59 | 60 | class TemplateCharField(models.CharField): 61 | 62 | def formfield(self, **kwargs): 63 | # This is a fairly standard way to set up some defaults 64 | # while letting the caller override them. 65 | defaults = {'form_class': TemplateFormField} 66 | defaults.update(kwargs) 67 | return super(TemplateCharField, self).formfield(**defaults) 68 | 69 | class TemplateTextField(models.TextField): 70 | 71 | def formfield(self, **kwargs): 72 | # This is a fairly standard way to set up some defaults 73 | # while letting the caller override them. 74 | defaults = {'form_class': TemplateFormField} 75 | defaults.update(kwargs) 76 | return super(TemplateTextField, self).formfield(**defaults) 77 | 78 | class RegexpExpressionFormField(forms.CharField): 79 | 80 | def clean(self, value): 81 | """ 82 | Validates that the input can be compiled as a Regular Expression. 83 | """ 84 | value = super(RegexpExpressionFormField, self).clean(value) 85 | import re 86 | try: 87 | re.compile(value) 88 | except Exception, error: 89 | raise ValidationError(error) 90 | return value 91 | 92 | class RegexpExpressionField(models.CharField): 93 | 94 | def formfield(self, **kwargs): 95 | # This is a fairly standard way to set up some defaults 96 | # while letting the caller override them. 97 | defaults = {'form_class': RegexpExpressionFormField} 98 | defaults.update(kwargs) 99 | return super(RegexpExpressionField, self).formfield(**defaults) 100 | -------------------------------------------------------------------------------- /form_designer/forms.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from django import forms 4 | from django.forms import widgets 5 | from django.conf import settings as django_settings 6 | from django.utils.translation import ugettext as _ 7 | 8 | from form_designer import settings 9 | from form_designer.models import FormDefinitionField, FormDefinition 10 | from form_designer.uploads import clean_files 11 | from form_designer.utils import get_class 12 | 13 | 14 | class DesignedForm(forms.Form): 15 | 16 | def __init__(self, form_definition, initial_data=None, *args, **kwargs): 17 | super(DesignedForm, self).__init__(*args, **kwargs) 18 | self.file_fields = [] 19 | for def_field in form_definition.formdefinitionfield_set.all(): 20 | self.add_defined_field(def_field, initial_data) 21 | self.fields[form_definition.submit_flag_name] = forms.BooleanField(required=False, initial=1, widget=widgets.HiddenInput) 22 | 23 | def add_defined_field(self, def_field, initial_data=None): 24 | if initial_data and initial_data.has_key(def_field.name): 25 | if not def_field.field_class in ('django.forms.MultipleChoiceField', 'django.forms.ModelMultipleChoiceField'): 26 | def_field.initial = initial_data.get(def_field.name) 27 | else: 28 | def_field.initial = initial_data.getlist(def_field.name) 29 | field = get_class(def_field.field_class)(**def_field.get_form_field_init_args()) 30 | self.fields[def_field.name] = field 31 | if isinstance(field, forms.FileField): 32 | self.file_fields.append(def_field) 33 | 34 | def clean(self): 35 | return clean_files(self) 36 | 37 | 38 | class FormDefinitionFieldInlineForm(forms.ModelForm): 39 | class Meta: 40 | model = FormDefinitionField 41 | 42 | def clean_regex(self): 43 | if not self.cleaned_data['regex'] and self.cleaned_data.has_key('field_class') and self.cleaned_data['field_class'] in ('django.forms.RegexField',): 44 | raise forms.ValidationError(_('This field class requires a regular expression.')) 45 | return self.cleaned_data['regex'] 46 | 47 | def clean_choice_model(self): 48 | if not self.cleaned_data['choice_model'] and self.cleaned_data.has_key('field_class') and self.cleaned_data['field_class'] in ('django.forms.ModelChoiceField', 'django.forms.ModelMultipleChoiceField'): 49 | raise forms.ValidationError(_('This field class requires a model.')) 50 | return self.cleaned_data['choice_model'] 51 | 52 | 53 | class FormDefinitionForm(forms.ModelForm): 54 | class Meta: 55 | model = FormDefinition 56 | 57 | def _media(self): 58 | js = [] 59 | plugins = [ 60 | 'js/jquery-ui.js', 61 | 'js/jquery-inline-positioning.js', 62 | 'js/jquery-inline-rename.js', 63 | 'js/jquery-inline-collapsible.js', 64 | 'js/jquery-inline-fieldset-collapsible.js', 65 | 'js/jquery-inline-prepopulate-label.js', 66 | ] 67 | if hasattr(django_settings, 'JQUERY_URL'): 68 | js.append(django_settings.JQUERY_URL) 69 | else: 70 | plugins = ['js/jquery.js'] + plugins 71 | js.extend( 72 | [os.path.join(settings.STATIC_URL, path) for path in plugins]) 73 | return forms.Media(js=js) 74 | media = property(_media) 75 | -------------------------------------------------------------------------------- /form_designer/locale/de/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/locale/de/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /form_designer/locale/de/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2012-01-19 20:56-0500\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | 18 | #: admin.py:27 admin.py:38 19 | msgid "Basic" 20 | msgstr "Grundlegendes" 21 | 22 | #: admin.py:28 23 | msgid "Display" 24 | msgstr "Darstellung" 25 | 26 | #: admin.py:29 settings.py:10 27 | msgid "Text" 28 | msgstr "Text" 29 | 30 | #: admin.py:30 31 | msgid "Numbers" 32 | msgstr "Zahlen" 33 | 34 | #: admin.py:31 settings.py:23 35 | msgid "Regex" 36 | msgstr "Regex" 37 | 38 | #: admin.py:32 39 | msgid "Choices" 40 | msgstr "Auswahl" 41 | 42 | #: admin.py:33 43 | msgid "Model Choices" 44 | msgstr "Modell-Auswahl" 45 | 46 | #: admin.py:39 47 | msgid "Settings" 48 | msgstr "" 49 | 50 | #: admin.py:40 51 | msgid "Mail form" 52 | msgstr "Mail-Formular" 53 | 54 | #: admin.py:41 55 | msgid "Templates" 56 | msgstr "Vorlagen" 57 | 58 | #: admin.py:42 59 | msgid "Messages" 60 | msgstr "Meldungen" 61 | 62 | #: admin.py:63 admin.py:102 admin.py:147 models.py:60 models.py:173 63 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:14 64 | msgid "Form" 65 | msgstr "Formular" 66 | 67 | #: admin.py:78 models.py:174 68 | msgid "Data" 69 | msgstr "Daten" 70 | 71 | #: admin.py:104 admin.py:149 models.py:172 72 | msgid "Created" 73 | msgstr "Erstellt" 74 | 75 | #: admin.py:106 admin.py:151 76 | msgid "ID" 77 | msgstr "ID" 78 | 79 | #: admin.py:125 80 | #, python-format 81 | msgid "Export selected %(verbose_name_plural)s as CSV" 82 | msgstr "Ausgewählte %(verbose_name_plural)s als CSV exportieren" 83 | 84 | #: admin.py:173 85 | #, python-format 86 | msgid "Export selected %(verbose_name_plural)s as XLS" 87 | msgstr "Ausgewählte %(verbose_name_plural)s als XLS exportieren" 88 | 89 | #: admin.py:185 90 | msgid "CSV export is not enabled." 91 | msgstr "CSV-Export ist nicht aktiviert." 92 | 93 | #: admin.py:190 94 | msgid "XLS export is not enabled." 95 | msgstr "XLS-Export ist nicht aktiviert." 96 | 97 | #: forms.py:43 98 | msgid "This field class requires a regular expression." 99 | msgstr "Diese Feld-Klasse benötigt einen Regulären Ausdruck." 100 | 101 | #: forms.py:48 102 | msgid "This field class requires a model." 103 | msgstr "Diese Feld-Klasse benötigt ein Modell." 104 | 105 | #: models.py:35 models.py:187 106 | msgid "name" 107 | msgstr "Name" 108 | 109 | #: models.py:36 110 | msgid "obfuscate URL to this form" 111 | msgstr "" 112 | 113 | #: models.py:36 114 | msgid "If enabled, the form can only be reached via a secret URL." 115 | msgstr "" 116 | 117 | #: models.py:39 118 | msgid "title" 119 | msgstr "Titel" 120 | 121 | #: models.py:40 122 | msgid "body" 123 | msgstr "Text" 124 | 125 | #: models.py:41 126 | msgid "target URL" 127 | msgstr "Ziel-URL" 128 | 129 | #: models.py:41 130 | msgid "" 131 | "If you leave this empty, the page where the form resides will be requested, " 132 | "and you can use the mail form and logging features. You can also send data " 133 | "to external sites: For instance, enter \"http://www.google.ch/search\" to " 134 | "create a search form." 135 | msgstr "" 136 | "Falls leer, wird die Seite angefragt, auf welcher sich das Formular " 137 | "befindet, und die Mail-Formular- und Logging-Funktionen können verwendet " 138 | "werden. Es ist auch möglich, Daten an externe Sites zu senden: Beispielweise " 139 | "\"http://www.google.ch/search\" eingeben, um ein Suchformular zu erstellen." 140 | 141 | #: models.py:42 142 | msgid "send form data to e-mail address" 143 | msgstr "Formulardaten an E-Mail-Adresse senden" 144 | 145 | #: models.py:43 146 | msgid "sender address" 147 | msgstr "Absender-Adresse" 148 | 149 | #: models.py:44 150 | msgid "email subject" 151 | msgstr "E-Mail-Betreff" 152 | 153 | #: models.py:45 154 | msgid "Send uploaded files as email attachments" 155 | msgstr "" 156 | 157 | #: models.py:46 158 | msgid "method" 159 | msgstr "Methode" 160 | 161 | #: models.py:47 162 | msgid "success message" 163 | msgstr "Erfolgsmeldung" 164 | 165 | #: models.py:48 166 | msgid "error message" 167 | msgstr "Fehlermeldung" 168 | 169 | #: models.py:49 170 | msgid "submit button label" 171 | msgstr "Beschriftung der Senden-Schaltfläche" 172 | 173 | #: models.py:50 174 | msgid "log form data" 175 | msgstr "Formulardaten loggen" 176 | 177 | #: models.py:50 178 | msgid "Logs all form submissions to the database." 179 | msgstr "Speichert alle Formular-Übermittlungen in der Datenbank." 180 | 181 | #: models.py:51 182 | msgid "save uploaded files" 183 | msgstr "" 184 | 185 | #: models.py:51 186 | msgid "Saves all uploaded files using server storage." 187 | msgstr "" 188 | 189 | #: models.py:52 190 | msgid "HTTP redirect after successful submission" 191 | msgstr "HTTP-Weiterleitung nach erfolgreicher Übermittlung" 192 | 193 | #: models.py:53 194 | msgid "clear form after successful submission" 195 | msgstr "Formular zurücksetzen nach erfolgreicher Übermittlung" 196 | 197 | #: models.py:54 198 | msgid "allow initial values via URL" 199 | msgstr "Initialwerte via URL erlauben" 200 | 201 | #: models.py:54 202 | msgid "" 203 | "If enabled, you can fill in form fields by adding them to the query string." 204 | msgstr "" 205 | "Falls aktiviert, ist es möglich, Formularfelder vorauszufüllen, indem sie " 206 | "dem Query-String hinzugefügt werden." 207 | 208 | #: models.py:55 209 | msgid "message template" 210 | msgstr "Nachrichten-Vorlage" 211 | 212 | #: models.py:55 213 | msgid "" 214 | "Your form fields are available as template context. Example: \"{{ message }}" 215 | "\" if you have a field named `message`. To iterate over all fields, use the " 216 | "variable `data` (a list containing a dictionary for each form field, each " 217 | "containing the elements `name`, `label`, `value`)." 218 | msgstr "" 219 | 220 | #: models.py:56 221 | msgid "form template" 222 | msgstr "Formular-Vorlage" 223 | 224 | #: models.py:57 225 | msgid "display logged submissions with form" 226 | msgstr "Geloggte Formulardaten mit Formular anzeigen" 227 | 228 | #: models.py:61 229 | msgid "Forms" 230 | msgstr "Formulare" 231 | 232 | #: models.py:116 233 | msgid "Fields" 234 | msgstr "Felder" 235 | 236 | #: models.py:177 237 | msgid "Form log" 238 | msgstr "Formular-Log" 239 | 240 | #: models.py:178 241 | msgid "Form logs" 242 | msgstr "Formular-Logs" 243 | 244 | #: models.py:184 245 | msgid "field class" 246 | msgstr "Feld-Klasse" 247 | 248 | #: models.py:185 249 | msgid "position" 250 | msgstr "Position" 251 | 252 | #: models.py:188 253 | msgid "label" 254 | msgstr "Beschriftung" 255 | 256 | #: models.py:189 257 | msgid "required" 258 | msgstr "Erforderlich" 259 | 260 | #: models.py:190 261 | msgid "include in result" 262 | msgstr "In Resultat einbeziehen" 263 | 264 | #: models.py:191 265 | msgid "widget" 266 | msgstr "Widget" 267 | 268 | #: models.py:192 269 | msgid "initial value" 270 | msgstr "Initialwert" 271 | 272 | #: models.py:193 273 | msgid "help text" 274 | msgstr "Hilfetext" 275 | 276 | #: models.py:195 277 | msgid "values" 278 | msgstr "Werte" 279 | 280 | #: models.py:195 281 | msgid "One value per line" 282 | msgstr "Ein Wert pro Zeile" 283 | 284 | #: models.py:196 285 | msgid "labels" 286 | msgstr "Beschriftungen" 287 | 288 | #: models.py:196 289 | msgid "One label per line" 290 | msgstr "Eine Beschriftung pro Zeile" 291 | 292 | #: models.py:198 293 | msgid "max. length" 294 | msgstr "Max. Länge" 295 | 296 | #: models.py:199 297 | msgid "min. length" 298 | msgstr "Min. Länge" 299 | 300 | #: models.py:200 301 | msgid "max. value" 302 | msgstr "Max. Wert" 303 | 304 | #: models.py:201 305 | msgid "min. value" 306 | msgstr "Min. Wert" 307 | 308 | #: models.py:202 309 | msgid "max. digits" 310 | msgstr "Max. Ziffern" 311 | 312 | #: models.py:203 313 | msgid "decimal places" 314 | msgstr "Dezimalstellen" 315 | 316 | #: models.py:205 317 | msgid "regular Expression" 318 | msgstr "Regulärer Ausdruck" 319 | 320 | #: models.py:208 321 | msgid "data model" 322 | msgstr "Datenmodell" 323 | 324 | #: models.py:209 325 | msgid "empty label" 326 | msgstr "Beschriftung falls leer" 327 | 328 | #: models.py:212 329 | msgid "field" 330 | msgstr "Feld" 331 | 332 | #: models.py:213 333 | msgid "fields" 334 | msgstr "Felder" 335 | 336 | #: settings.py:11 337 | msgid "E-mail address" 338 | msgstr "E-Mail-Adresse" 339 | 340 | #: settings.py:12 341 | msgid "Web address" 342 | msgstr "Web-Adresse" 343 | 344 | #: settings.py:13 345 | msgid "Number" 346 | msgstr "Zahl" 347 | 348 | #: settings.py:14 349 | msgid "Decimal number" 350 | msgstr "Dezimalzahl" 351 | 352 | #: settings.py:15 353 | msgid "Yes/No" 354 | msgstr "Ja/Nein" 355 | 356 | #: settings.py:16 357 | msgid "Date" 358 | msgstr "Datum" 359 | 360 | #: settings.py:17 361 | msgid "Date & time" 362 | msgstr "Datum & Zeit" 363 | 364 | #: settings.py:18 365 | msgid "Time" 366 | msgstr "Zeit" 367 | 368 | #: settings.py:19 369 | msgid "Choice" 370 | msgstr "Auswahl" 371 | 372 | #: settings.py:20 373 | msgid "Multiple Choice" 374 | msgstr "Mehrfach-Auswahl" 375 | 376 | #: settings.py:21 377 | msgid "Model Choice" 378 | msgstr "Modell-Auswahl" 379 | 380 | #: settings.py:22 381 | msgid "Model Multiple Choice" 382 | msgstr "Modell-Mehrfach-Auswahl" 383 | 384 | #: settings.py:24 385 | msgid "File" 386 | msgstr "Datei" 387 | 388 | #: settings.py:29 settings.py:37 389 | msgid "Default" 390 | msgstr "Voreinstellung" 391 | 392 | #: settings.py:30 393 | msgid "Text area" 394 | msgstr "Textfeld" 395 | 396 | #: settings.py:31 397 | msgid "Password input" 398 | msgstr "Passwortfeld" 399 | 400 | #: settings.py:32 401 | msgid "Hidden input" 402 | msgstr "Versteckter Wert" 403 | 404 | #: settings.py:33 405 | msgid "Radio button" 406 | msgstr "Radio-Buttons" 407 | 408 | #: settings.py:38 409 | msgid "as paragraphs" 410 | msgstr "als Absätze" 411 | 412 | #: settings.py:39 413 | msgid "as table" 414 | msgstr "als Tabelle" 415 | 416 | #: settings.py:40 417 | msgid "as table (horizontal)" 418 | msgstr "als Tabelle (horizontal)" 419 | 420 | #: settings.py:41 421 | msgid "as unordered list" 422 | msgstr "als unsortierte Liste" 423 | 424 | #: settings.py:42 425 | msgid "custom implementation" 426 | msgstr "eigene Implementierung" 427 | 428 | #: uploads.py:20 429 | msgid "This field is required." 430 | msgstr "Diese Feld-Klasse benötigt ein Modell." 431 | 432 | #: uploads.py:25 433 | msgid "This file type is not allowed." 434 | msgstr "" 435 | 436 | #: uploads.py:27 437 | #, python-format 438 | msgid "Please keep file size under %(max_size)s. Current size is %(size)s." 439 | msgstr "" 440 | 441 | #: views.py:21 442 | msgid "Thank you, the data was submitted successfully." 443 | msgstr "Vielen Dank, die Daten wurden übermittelt." 444 | 445 | #: views.py:22 446 | msgid "The data could not be submitted, please try again." 447 | msgstr "Die Daten konnten nicht übermittelt werden, bitte erneut versuchen." 448 | 449 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:13 450 | msgid "Form Designer" 451 | msgstr "" 452 | 453 | #: contrib/cms_plugins/form_designer_form/models.py:8 454 | msgid "form" 455 | msgstr "Formular" 456 | 457 | #: templates/admin/form_designer/formlog/change_list.html:9 458 | msgid "Export CSV" 459 | msgstr "CSV exportieren" 460 | 461 | #: templates/admin/form_designer/formlog/change_list.html:16 462 | msgid "Export XLS" 463 | msgstr "XLS exportieren" 464 | 465 | #: templates/html/formdefinition/forms/includes/submit.html:2 466 | msgid "Submit" 467 | msgstr "Absenden" 468 | 469 | #: templatetags/friendly.py:18 470 | msgid "yes" 471 | msgstr "ja" 472 | 473 | #: templatetags/friendly.py:18 474 | msgid "no" 475 | msgstr "nein" 476 | -------------------------------------------------------------------------------- /form_designer/locale/en/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/locale/en/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /form_designer/locale/en/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2012-01-19 20:56-0500\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | 18 | #: admin.py:27 admin.py:38 19 | msgid "Basic" 20 | msgstr "" 21 | 22 | #: admin.py:28 23 | msgid "Display" 24 | msgstr "" 25 | 26 | #: admin.py:29 settings.py:10 27 | msgid "Text" 28 | msgstr "" 29 | 30 | #: admin.py:30 31 | msgid "Numbers" 32 | msgstr "" 33 | 34 | #: admin.py:31 settings.py:23 35 | msgid "Regex" 36 | msgstr "" 37 | 38 | #: admin.py:32 39 | msgid "Choices" 40 | msgstr "" 41 | 42 | #: admin.py:33 43 | msgid "Model Choices" 44 | msgstr "" 45 | 46 | #: admin.py:39 47 | msgid "Settings" 48 | msgstr "" 49 | 50 | #: admin.py:40 51 | msgid "Mail form" 52 | msgstr "" 53 | 54 | #: admin.py:41 55 | msgid "Templates" 56 | msgstr "" 57 | 58 | #: admin.py:42 59 | msgid "Messages" 60 | msgstr "" 61 | 62 | #: admin.py:63 admin.py:102 admin.py:147 models.py:60 models.py:173 63 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:14 64 | msgid "Form" 65 | msgstr "" 66 | 67 | #: admin.py:78 models.py:174 68 | msgid "Data" 69 | msgstr "" 70 | 71 | #: admin.py:104 admin.py:149 models.py:172 72 | msgid "Created" 73 | msgstr "" 74 | 75 | #: admin.py:106 admin.py:151 76 | msgid "ID" 77 | msgstr "" 78 | 79 | #: admin.py:125 80 | #, python-format 81 | msgid "Export selected %(verbose_name_plural)s as CSV" 82 | msgstr "" 83 | 84 | #: admin.py:173 85 | #, python-format 86 | msgid "Export selected %(verbose_name_plural)s as XLS" 87 | msgstr "" 88 | 89 | #: admin.py:185 90 | msgid "CSV export is not enabled." 91 | msgstr "" 92 | 93 | #: admin.py:190 94 | msgid "XLS export is not enabled." 95 | msgstr "" 96 | 97 | #: forms.py:43 98 | msgid "This field class requires a regular expression." 99 | msgstr "" 100 | 101 | #: forms.py:48 102 | msgid "This field class requires a model." 103 | msgstr "" 104 | 105 | #: models.py:35 models.py:187 106 | msgid "name" 107 | msgstr "" 108 | 109 | #: models.py:36 110 | msgid "obfuscate URL to this form" 111 | msgstr "" 112 | 113 | #: models.py:36 114 | msgid "If enabled, the form can only be reached via a secret URL." 115 | msgstr "" 116 | 117 | #: models.py:39 118 | msgid "title" 119 | msgstr "" 120 | 121 | #: models.py:40 122 | msgid "body" 123 | msgstr "" 124 | 125 | #: models.py:41 126 | msgid "target URL" 127 | msgstr "" 128 | 129 | #: models.py:41 130 | msgid "" 131 | "If you leave this empty, the page where the form resides will be requested, " 132 | "and you can use the mail form and logging features. You can also send data " 133 | "to external sites: For instance, enter \"http://www.google.ch/search\" to " 134 | "create a search form." 135 | msgstr "" 136 | 137 | #: models.py:42 138 | msgid "send form data to e-mail address" 139 | msgstr "" 140 | 141 | #: models.py:43 142 | msgid "sender address" 143 | msgstr "" 144 | 145 | #: models.py:44 146 | msgid "email subject" 147 | msgstr "" 148 | 149 | #: models.py:45 150 | msgid "Send uploaded files as email attachments" 151 | msgstr "" 152 | 153 | #: models.py:46 154 | msgid "method" 155 | msgstr "" 156 | 157 | #: models.py:47 158 | msgid "success message" 159 | msgstr "" 160 | 161 | #: models.py:48 162 | msgid "error message" 163 | msgstr "" 164 | 165 | #: models.py:49 166 | msgid "submit button label" 167 | msgstr "" 168 | 169 | #: models.py:50 170 | msgid "log form data" 171 | msgstr "" 172 | 173 | #: models.py:50 174 | msgid "Logs all form submissions to the database." 175 | msgstr "" 176 | 177 | #: models.py:51 178 | msgid "save uploaded files" 179 | msgstr "" 180 | 181 | #: models.py:51 182 | msgid "Saves all uploaded files using server storage." 183 | msgstr "" 184 | 185 | #: models.py:52 186 | msgid "HTTP redirect after successful submission" 187 | msgstr "" 188 | 189 | #: models.py:53 190 | msgid "clear form after successful submission" 191 | msgstr "" 192 | 193 | #: models.py:54 194 | msgid "allow initial values via URL" 195 | msgstr "" 196 | 197 | #: models.py:54 198 | msgid "" 199 | "If enabled, you can fill in form fields by adding them to the query string." 200 | msgstr "" 201 | 202 | #: models.py:55 203 | msgid "message template" 204 | msgstr "" 205 | 206 | #: models.py:55 207 | msgid "" 208 | "Your form fields are available as template context. Example: \"{{ message }}" 209 | "\" if you have a field named `message`. To iterate over all fields, use the " 210 | "variable `data` (a list containing a dictionary for each form field, each " 211 | "containing the elements `name`, `label`, `value`)." 212 | msgstr "" 213 | 214 | #: models.py:56 215 | msgid "form template" 216 | msgstr "" 217 | 218 | #: models.py:57 219 | msgid "display logged submissions with form" 220 | msgstr "" 221 | 222 | #: models.py:61 223 | msgid "Forms" 224 | msgstr "" 225 | 226 | #: models.py:116 227 | msgid "Fields" 228 | msgstr "" 229 | 230 | #: models.py:177 231 | msgid "Form log" 232 | msgstr "" 233 | 234 | #: models.py:178 235 | msgid "Form logs" 236 | msgstr "" 237 | 238 | #: models.py:184 239 | msgid "field class" 240 | msgstr "" 241 | 242 | #: models.py:185 243 | msgid "position" 244 | msgstr "" 245 | 246 | #: models.py:188 247 | msgid "label" 248 | msgstr "" 249 | 250 | #: models.py:189 251 | msgid "required" 252 | msgstr "" 253 | 254 | #: models.py:190 255 | msgid "include in result" 256 | msgstr "" 257 | 258 | #: models.py:191 259 | msgid "widget" 260 | msgstr "" 261 | 262 | #: models.py:192 263 | msgid "initial value" 264 | msgstr "" 265 | 266 | #: models.py:193 267 | msgid "help text" 268 | msgstr "" 269 | 270 | #: models.py:195 271 | msgid "values" 272 | msgstr "" 273 | 274 | #: models.py:195 275 | msgid "One value per line" 276 | msgstr "" 277 | 278 | #: models.py:196 279 | msgid "labels" 280 | msgstr "" 281 | 282 | #: models.py:196 283 | msgid "One label per line" 284 | msgstr "" 285 | 286 | #: models.py:198 287 | msgid "max. length" 288 | msgstr "" 289 | 290 | #: models.py:199 291 | msgid "min. length" 292 | msgstr "" 293 | 294 | #: models.py:200 295 | msgid "max. value" 296 | msgstr "" 297 | 298 | #: models.py:201 299 | msgid "min. value" 300 | msgstr "" 301 | 302 | #: models.py:202 303 | msgid "max. digits" 304 | msgstr "" 305 | 306 | #: models.py:203 307 | msgid "decimal places" 308 | msgstr "" 309 | 310 | #: models.py:205 311 | msgid "regular Expression" 312 | msgstr "" 313 | 314 | #: models.py:208 315 | msgid "data model" 316 | msgstr "" 317 | 318 | #: models.py:209 319 | msgid "empty label" 320 | msgstr "" 321 | 322 | #: models.py:212 323 | msgid "field" 324 | msgstr "" 325 | 326 | #: models.py:213 327 | msgid "fields" 328 | msgstr "" 329 | 330 | #: settings.py:11 331 | msgid "E-mail address" 332 | msgstr "" 333 | 334 | #: settings.py:12 335 | msgid "Web address" 336 | msgstr "" 337 | 338 | #: settings.py:13 339 | msgid "Number" 340 | msgstr "" 341 | 342 | #: settings.py:14 343 | msgid "Decimal number" 344 | msgstr "" 345 | 346 | #: settings.py:15 347 | msgid "Yes/No" 348 | msgstr "" 349 | 350 | #: settings.py:16 351 | msgid "Date" 352 | msgstr "" 353 | 354 | #: settings.py:17 355 | msgid "Date & time" 356 | msgstr "" 357 | 358 | #: settings.py:18 359 | msgid "Time" 360 | msgstr "" 361 | 362 | #: settings.py:19 363 | msgid "Choice" 364 | msgstr "" 365 | 366 | #: settings.py:20 367 | msgid "Multiple Choice" 368 | msgstr "" 369 | 370 | #: settings.py:21 371 | msgid "Model Choice" 372 | msgstr "" 373 | 374 | #: settings.py:22 375 | msgid "Model Multiple Choice" 376 | msgstr "" 377 | 378 | #: settings.py:24 379 | msgid "File" 380 | msgstr "" 381 | 382 | #: settings.py:29 settings.py:37 383 | msgid "Default" 384 | msgstr "" 385 | 386 | #: settings.py:30 387 | msgid "Text area" 388 | msgstr "" 389 | 390 | #: settings.py:31 391 | msgid "Password input" 392 | msgstr "" 393 | 394 | #: settings.py:32 395 | msgid "Hidden input" 396 | msgstr "" 397 | 398 | #: settings.py:33 399 | msgid "Radio button" 400 | msgstr "" 401 | 402 | #: settings.py:38 403 | msgid "as paragraphs" 404 | msgstr "" 405 | 406 | #: settings.py:39 407 | msgid "as table" 408 | msgstr "" 409 | 410 | #: settings.py:40 411 | msgid "as table (horizontal)" 412 | msgstr "" 413 | 414 | #: settings.py:41 415 | msgid "as unordered list" 416 | msgstr "" 417 | 418 | #: settings.py:42 419 | msgid "custom implementation" 420 | msgstr "" 421 | 422 | #: uploads.py:20 423 | msgid "This field is required." 424 | msgstr "" 425 | 426 | #: uploads.py:25 427 | msgid "This file type is not allowed." 428 | msgstr "" 429 | 430 | #: uploads.py:27 431 | #, python-format 432 | msgid "Please keep file size under %(max_size)s. Current size is %(size)s." 433 | msgstr "" 434 | 435 | #: views.py:21 436 | msgid "Thank you, the data was submitted successfully." 437 | msgstr "" 438 | 439 | #: views.py:22 440 | msgid "The data could not be submitted, please try again." 441 | msgstr "" 442 | 443 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:13 444 | msgid "Form Designer" 445 | msgstr "" 446 | 447 | #: contrib/cms_plugins/form_designer_form/models.py:8 448 | msgid "form" 449 | msgstr "" 450 | 451 | #: templates/admin/form_designer/formlog/change_list.html:9 452 | msgid "Export CSV" 453 | msgstr "" 454 | 455 | #: templates/admin/form_designer/formlog/change_list.html:16 456 | msgid "Export XLS" 457 | msgstr "" 458 | 459 | #: templates/html/formdefinition/forms/includes/submit.html:2 460 | msgid "Submit" 461 | msgstr "" 462 | 463 | #: templatetags/friendly.py:18 464 | msgid "yes" 465 | msgstr "" 466 | 467 | #: templatetags/friendly.py:18 468 | msgid "no" 469 | msgstr "" 470 | -------------------------------------------------------------------------------- /form_designer/locale/fi/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/locale/fi/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /form_designer/locale/fi/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2012-09-28 11:05+0300\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 18 | 19 | #: .\admin.py:18 .\admin.py:30 20 | msgid "Basic" 21 | msgstr "Perus" 22 | 23 | #: .\admin.py:19 24 | msgid "Display" 25 | msgstr "Näyttöasetukset" 26 | 27 | #: .\admin.py:20 .\settings.py:10 28 | msgid "Text" 29 | msgstr "Tekstiasetukset" 30 | 31 | #: .\admin.py:21 32 | msgid "Numbers" 33 | msgstr "Numeroasetukset" 34 | 35 | #: .\admin.py:22 .\settings.py:23 36 | msgid "Regex" 37 | msgstr "Säännöllinen lauseke" 38 | 39 | #: .\admin.py:23 40 | msgid "Choices" 41 | msgstr "Valinnat" 42 | 43 | #: .\admin.py:24 44 | msgid "Model Choices" 45 | msgstr "Tietokantavalinnat" 46 | 47 | #: .\admin.py:31 48 | msgid "Settings" 49 | msgstr "Asetukset" 50 | 51 | #: .\admin.py:32 52 | msgid "Mail form" 53 | msgstr "Sähköpostiasetukset" 54 | 55 | #: .\admin.py:33 56 | msgid "Templates" 57 | msgstr "Asettelupohjat" 58 | 59 | #: .\admin.py:34 60 | msgid "Messages" 61 | msgstr "Viestit" 62 | 63 | #: .\admin.py:63 64 | #, python-format 65 | msgid "Export selected %%(verbose_name_plural)s as %s" 66 | msgstr "Vie valitut %%(verbose_name_plural)s %s-muotoon" 67 | 68 | #: .\admin.py:73 .\models.py:55 69 | #: .\contrib\cms_plugins\form_designer_form\cms_plugins.py:14 70 | #: .\contrib\exporters\__init__.py:58 71 | msgid "Form" 72 | msgstr "Lomake" 73 | 74 | #: .\admin.py:84 75 | msgid "Data" 76 | msgstr "Data" 77 | 78 | #: .\admin.py:108 79 | #, python-format 80 | msgid "Export view as %s" 81 | msgstr "Vie näkymä %s-muotoon" 82 | 83 | #: .\forms.py:44 84 | msgid "This field class requires a regular expression." 85 | msgstr "Tämä kenttätyyppi vaatii säännöllisen lausekkeen." 86 | 87 | #: .\forms.py:49 88 | msgid "This field class requires a model." 89 | msgstr "Tämä kenttätyyppi vaatii tietokantamallin." 90 | 91 | #: .\models.py:30 .\models.py:180 92 | msgid "name" 93 | msgstr "nimi" 94 | 95 | #: .\models.py:31 96 | msgid "obfuscate URL to this form" 97 | msgstr "piilota tämän lomakkeen URL-osoite" 98 | 99 | #: .\models.py:31 100 | msgid "If enabled, the form can only be reached via a secret URL." 101 | msgstr "Lomakkeeseen pääsee vain salaisesta URL-osoitteesta mikäli tämä kohta on valittu." 102 | 103 | #: .\models.py:34 104 | msgid "title" 105 | msgstr "otsikko" 106 | 107 | #: .\models.py:35 108 | msgid "body" 109 | msgstr "sisältö" 110 | 111 | #: .\models.py:36 112 | msgid "target URL" 113 | msgstr "kohde-URL" 114 | 115 | #: .\models.py:36 116 | msgid "" 117 | "If you leave this empty, the page where the form resides will be requested, " 118 | "and you can use the mail form and logging features. You can also send data " 119 | "to external sites: For instance, enter \"http://www.google.ch/search\" to " 120 | "create a search form." 121 | msgstr "" 122 | "Mikäli jätät tämän tyhjäksi, voit käyttää sähköpostiasetuksia ja lokitoiminnallisuutta." 123 | "Voit myös lähettää lomakkeen tiedot ulkoisille sivustoille; syöttämällä esimerkiksi \"http://www.google.fi/search\" " 124 | "voit luoda hakulomakkeen." 125 | 126 | #: .\models.py:37 127 | msgid "send form data to e-mail address" 128 | msgstr "lähetä lomakkeen tiedot sähköpostitse" 129 | 130 | #: .\models.py:38 131 | msgid "sender address" 132 | msgstr "lähettäjän osoite" 133 | 134 | #: .\models.py:39 135 | msgid "email subject" 136 | msgstr "sähköpostiviestin aihe" 137 | 138 | #: .\models.py:40 139 | msgid "Send uploaded files as email attachments" 140 | msgstr "Liitä lähetetyt tiedostot sähköpostiviesteihin liitetiedostoina" 141 | 142 | #: .\models.py:41 143 | msgid "method" 144 | msgstr "metodi" 145 | 146 | #: .\models.py:42 147 | msgid "success message" 148 | msgstr "kiitosviesti" 149 | 150 | #: .\models.py:43 151 | msgid "error message" 152 | msgstr "virheviesti" 153 | 154 | #: .\models.py:44 155 | msgid "submit button label" 156 | msgstr "lähetyspainikkeen teksti" 157 | 158 | #: .\models.py:45 159 | msgid "log form data" 160 | msgstr "käytä lokia" 161 | 162 | #: .\models.py:45 163 | msgid "Logs all form submissions to the database." 164 | msgstr "Tallentaa kaikki lähetetyt lomakkeet tietokantaan." 165 | 166 | #: .\models.py:46 167 | msgid "save uploaded files" 168 | msgstr "tallenna lähetetyt tiedostot" 169 | 170 | #: .\models.py:46 171 | msgid "Saves all uploaded files using server storage." 172 | msgstr "Tallentaa kaikki lähetetyt tiedostot palvelimelle." 173 | 174 | #: .\models.py:47 175 | msgid "HTTP redirect after successful submission" 176 | msgstr "HTTP-uudelleenohjaus onnistuneen lähetyksen jälkeen" 177 | 178 | #: .\models.py:48 179 | msgid "clear form after successful submission" 180 | msgstr "tyhjennä lomake onnistuneen lähetyksen jälkeen" 181 | 182 | #: .\models.py:49 183 | msgid "allow initial values via URL" 184 | msgstr "salli oletusarvot URL-osoitteessa" 185 | 186 | #: .\models.py:49 187 | msgid "" 188 | "If enabled, you can fill in form fields by adding them to the query string." 189 | msgstr "" 190 | "Mikäli tämä on valittu voit täyttää kenttiin oletusarvot käyttämällä URL:n kyselyosaa." 191 | 192 | #: .\models.py:50 193 | msgid "message template" 194 | msgstr "viestipohja" 195 | 196 | #: .\models.py:50 197 | msgid "" 198 | "Your form fields are available as template context. Example: \"{{ message }}" 199 | "\" if you have a field named `message`. To iterate over all fields, use the " 200 | "variable `data` (a list containing a dictionary for each form field, each " 201 | "containing the elements `name`, `label`, `value`)." 202 | msgstr "" 203 | "Lomakkeen kentät ovat käytettävissä. Saat esimerkiksi \"viesti\"-nimisen kentän " 204 | "viestipohjaan kirjoittamalla \"{{ viesti }}\". Iteroidaksesi kaikki lomakkeen kentät läpi " 205 | "voit käyttää \"data\"-nimistä muuttujaa (lista joka sisältää dictin jossa on elementit \"name\", " 206 | "\"label\" ja \"value\" per lomakekenttä)." 207 | 208 | #: .\models.py:51 209 | msgid "form template" 210 | msgstr "lomakepohja" 211 | 212 | #: .\models.py:52 213 | msgid "display logged submissions with form" 214 | msgstr "näytä tämän lomakkeen lokissa olevat lähetykset" 215 | 216 | #: .\models.py:56 217 | msgid "Forms" 218 | msgstr "Lomakkeet" 219 | 220 | #: .\models.py:116 221 | msgid "Fields" 222 | msgstr "Kentät" 223 | 224 | #: .\models.py:177 225 | msgid "field class" 226 | msgstr "kentän tyyppi" 227 | 228 | #: .\models.py:178 229 | msgid "position" 230 | msgstr "sijainti" 231 | 232 | #: .\models.py:181 233 | msgid "label" 234 | msgstr "otsikko" 235 | 236 | #: .\models.py:182 237 | msgid "required" 238 | msgstr "pakollinen" 239 | 240 | #: .\models.py:183 241 | msgid "include in result" 242 | msgstr "sisällytä tulokseen" 243 | 244 | #: .\models.py:184 245 | msgid "widget" 246 | msgstr "vimpain" 247 | 248 | #: .\models.py:185 249 | msgid "initial value" 250 | msgstr "oletusarvo" 251 | 252 | #: .\models.py:186 253 | msgid "help text" 254 | msgstr "ohjeteksti" 255 | 256 | #: .\models.py:188 257 | msgid "values" 258 | msgstr "arvot" 259 | 260 | #: .\models.py:188 261 | msgid "One value per line" 262 | msgstr "Yksi arvo per rivi" 263 | 264 | #: .\models.py:189 265 | msgid "labels" 266 | msgstr "otsikot" 267 | 268 | #: .\models.py:189 269 | msgid "One label per line" 270 | msgstr "Yksi otsikko per rivi" 271 | 272 | #: .\models.py:191 273 | msgid "max. length" 274 | msgstr "enimmäispituus" 275 | 276 | #: .\models.py:192 277 | msgid "min. length" 278 | msgstr "vähimmäispituus" 279 | 280 | #: .\models.py:193 281 | msgid "max. value" 282 | msgstr "enimmäisarvo" 283 | 284 | #: .\models.py:194 285 | msgid "min. value" 286 | msgstr "vähimmäisarvo" 287 | 288 | #: .\models.py:195 289 | msgid "max. digits" 290 | msgstr "numeroiden enimmäismäärä" 291 | 292 | #: .\models.py:196 293 | msgid "decimal places" 294 | msgstr "desimaalitarkkuus" 295 | 296 | #: .\models.py:198 297 | msgid "regular Expression" 298 | msgstr "säännöllinen lauseke" 299 | 300 | #: .\models.py:201 301 | msgid "data model" 302 | msgstr "tietokantamalli" 303 | 304 | #: .\models.py:202 305 | msgid "empty label" 306 | msgstr "tyhjä otsikko" 307 | 308 | #: .\models.py:205 309 | msgid "field" 310 | msgstr "kenttä" 311 | 312 | #: .\models.py:206 313 | msgid "fields" 314 | msgstr "kentät" 315 | 316 | #: .\models.py:297 .\contrib\exporters\__init__.py:60 317 | msgid "Created" 318 | msgstr "Luotu" 319 | 320 | #: .\models.py:363 321 | msgid "field name" 322 | msgstr "kentän nimi" 323 | 324 | #: .\models.py:367 .\models.py:372 325 | msgid "value" 326 | msgstr "arvo" 327 | 328 | #: .\settings.py:11 329 | msgid "E-mail address" 330 | msgstr "Sähköpostiosoite" 331 | 332 | #: .\settings.py:12 333 | msgid "Web address" 334 | msgstr "Www-osoite" 335 | 336 | #: .\settings.py:13 337 | msgid "Number" 338 | msgstr "Luku" 339 | 340 | #: .\settings.py:14 341 | msgid "Decimal number" 342 | msgstr "Desimaaliluku" 343 | 344 | #: .\settings.py:15 345 | msgid "Yes/No" 346 | msgstr "Kyllä/Ei" 347 | 348 | #: .\settings.py:16 349 | msgid "Date" 350 | msgstr "Päivämäärä" 351 | 352 | #: .\settings.py:17 353 | msgid "Date & time" 354 | msgstr "Päivämäärä ja aika" 355 | 356 | #: .\settings.py:18 357 | msgid "Time" 358 | msgstr "Aika" 359 | 360 | #: .\settings.py:19 361 | msgid "Choice" 362 | msgstr "Valinta" 363 | 364 | #: .\settings.py:20 365 | msgid "Multiple Choice" 366 | msgstr "Monivalinta" 367 | 368 | #: .\settings.py:21 369 | msgid "Model Choice" 370 | msgstr "Tietokantamallivalinta" 371 | 372 | #: .\settings.py:22 373 | msgid "Model Multiple Choice" 374 | msgstr "Monivalinta (tietokannasta)" 375 | 376 | #: .\settings.py:24 377 | msgid "File" 378 | msgstr "Tiedosto" 379 | 380 | #: .\settings.py:29 .\settings.py:42 381 | msgid "Default" 382 | msgstr "Oletus" 383 | 384 | #: .\settings.py:30 385 | msgid "Text area" 386 | msgstr "Tekstikenttä" 387 | 388 | #: .\settings.py:31 389 | msgid "Password input" 390 | msgstr "Salasanakenttä" 391 | 392 | #: .\settings.py:32 393 | msgid "Hidden input" 394 | msgstr "Piilotettu kenttä" 395 | 396 | #: .\settings.py:33 397 | msgid "Radio button" 398 | msgstr "Valintanappi (radio)" 399 | 400 | #: .\settings.py:43 401 | msgid "as paragraphs" 402 | msgstr "tekstikappaleina" 403 | 404 | #: .\settings.py:44 405 | msgid "as table" 406 | msgstr "taulukkona" 407 | 408 | #: .\settings.py:45 409 | msgid "as table (horizontal)" 410 | msgstr "taulukkona (vaakasuuntaisesti)" 411 | 412 | #: .\settings.py:46 413 | msgid "as unordered list" 414 | msgstr "listana" 415 | 416 | #: .\settings.py:47 417 | msgid "custom implementation" 418 | msgstr "räätälöity ratkaisu" 419 | 420 | #: .\uploads.py:20 421 | msgid "This field is required." 422 | msgstr "Tämä kenttä on pakollinen." 423 | 424 | #: .\uploads.py:25 425 | msgid "This file type is not allowed." 426 | msgstr "Tämä tiedostomuoto on kielletty." 427 | 428 | #: .\uploads.py:27 429 | #, python-format 430 | msgid "Please keep file size under %(max_size)s. Current size is %(size)s." 431 | msgstr "Tiedostojen enimmäiskoko on %(max_size)s. Nykyinen koko on %(size)s." 432 | 433 | #: .\views.py:21 434 | msgid "Thank you, the data was submitted successfully." 435 | msgstr "Kiitos! Lomake lähetetty." 436 | 437 | #: .\views.py:22 438 | msgid "The data could not be submitted, please try again." 439 | msgstr "Lähetys epäonnistui, ole hyvä ja kokeile uudestaan." 440 | 441 | #: .\contrib\cms_plugins\form_designer_form\cms_plugins.py:13 442 | msgid "Form Designer" 443 | msgstr "Lomaketyökalu" 444 | 445 | #: .\contrib\cms_plugins\form_designer_form\models.py:8 446 | msgid "form" 447 | msgstr "lomake" 448 | 449 | #: .\contrib\exporters\__init__.py:62 450 | msgid "ID" 451 | msgstr "ID" 452 | 453 | #: .\templates\html\formdefinition\forms\includes\submit.html.py:2 454 | msgid "Submit" 455 | msgstr "Lähetä" 456 | 457 | #: .\templatetags\friendly.py:20 458 | msgid "yes" 459 | msgstr "kyllä" 460 | 461 | #: .\templatetags\friendly.py:20 462 | msgid "no" 463 | msgstr "ei" 464 | -------------------------------------------------------------------------------- /form_designer/locale/fr/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/locale/fr/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /form_designer/locale/fr/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # django-form-designer locale. 2 | # This file is distributed under the same license as the django-form-designer package. 3 | # SIMON CHARETTE , 2011. 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: 1\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2012-01-19 20:56-0500\n" 10 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "Last-Translator: SIMON CHARETTE \n" 12 | "Language-Team: fr\n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "Language: \n" 17 | 18 | #: admin.py:27 admin.py:38 19 | msgid "Basic" 20 | msgstr "Base" 21 | 22 | #: admin.py:28 23 | msgid "Display" 24 | msgstr "Affichage" 25 | 26 | #: admin.py:29 settings.py:10 27 | msgid "Text" 28 | msgstr "Texte" 29 | 30 | #: admin.py:30 31 | msgid "Numbers" 32 | msgstr "Nombres" 33 | 34 | #: admin.py:31 settings.py:23 35 | msgid "Regex" 36 | msgstr "Expression régulière" 37 | 38 | #: admin.py:32 39 | msgid "Choices" 40 | msgstr "Choix" 41 | 42 | #: admin.py:33 43 | msgid "Model Choices" 44 | msgstr "Choix de Modèles" 45 | 46 | #: admin.py:39 47 | msgid "Settings" 48 | msgstr "Réglages" 49 | 50 | #: admin.py:40 51 | msgid "Mail form" 52 | msgstr "Envoi de courriels" 53 | 54 | #: admin.py:41 55 | msgid "Templates" 56 | msgstr "Gabarits" 57 | 58 | #: admin.py:42 59 | msgid "Messages" 60 | msgstr "Messages" 61 | 62 | #: admin.py:63 admin.py:102 admin.py:147 models.py:60 models.py:173 63 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:14 64 | msgid "Form" 65 | msgstr "Formulaire" 66 | 67 | #: admin.py:78 models.py:174 68 | msgid "Data" 69 | msgstr "Données" 70 | 71 | #: admin.py:104 admin.py:149 models.py:172 72 | msgid "Created" 73 | msgstr "Créé" 74 | 75 | #: admin.py:106 admin.py:151 76 | msgid "ID" 77 | msgstr "ID" 78 | 79 | #: admin.py:125 80 | #, python-format 81 | msgid "Export selected %(verbose_name_plural)s as CSV" 82 | msgstr "Exporter les %(verbose_name_plural)s en CSV" 83 | 84 | #: admin.py:173 85 | #, python-format 86 | msgid "Export selected %(verbose_name_plural)s as XLS" 87 | msgstr "Exporter les %(verbose_name_plural)s en XLS" 88 | 89 | #: admin.py:185 90 | msgid "CSV export is not enabled." 91 | msgstr "L'exportation en CSV n'est pas activé." 92 | 93 | #: admin.py:190 94 | msgid "XLS export is not enabled." 95 | msgstr "L'exportation en XLS n'est pas activé" 96 | 97 | #: forms.py:43 98 | msgid "This field class requires a regular expression." 99 | msgstr "Ce type de champ necessite une expression régulière." 100 | 101 | #: forms.py:48 102 | msgid "This field class requires a model." 103 | msgstr "Cette classe de champ nécessite un modèle." 104 | 105 | #: models.py:35 models.py:187 106 | msgid "name" 107 | msgstr "Nom" 108 | 109 | #: models.py:36 110 | msgid "obfuscate URL to this form" 111 | msgstr "Obscurcir l'URL vers ce formulaire" 112 | 113 | #: models.py:36 114 | msgid "If enabled, the form can only be reached via a secret URL." 115 | msgstr "" 116 | "Si activé, il sera seulement possible d'atteindre le formulaire via une URL " 117 | "secrète." 118 | 119 | #: models.py:39 120 | msgid "title" 121 | msgstr "Titre" 122 | 123 | #: models.py:40 124 | msgid "body" 125 | msgstr "Corps" 126 | 127 | #: models.py:41 128 | msgid "target URL" 129 | msgstr "URL cible" 130 | 131 | #: models.py:41 132 | msgid "" 133 | "If you leave this empty, the page where the form resides will be requested, " 134 | "and you can use the mail form and logging features. You can also send data " 135 | "to external sites: For instance, enter \"http://www.google.ch/search\" to " 136 | "create a search form." 137 | msgstr "" 138 | "Si vous laisser ce champs vide, le formulaire sera envoyé vers la page où il " 139 | "se trouve et vous pourrez utiliser les fonctionnalités de courriel et de " 140 | "sauvegarde. Vous pouvez aussi envoyer les données saisies vers un site " 141 | "externe: Par exemple, entrez \"http://www.google.fr/search\" pour créer un " 142 | "formulaire de recherche." 143 | 144 | #: models.py:42 145 | msgid "send form data to e-mail address" 146 | msgstr "Envoyer les données saisies aux adresses courriels." 147 | 148 | #: models.py:43 149 | msgid "sender address" 150 | msgstr "Addresse de l'expéditeur" 151 | 152 | #: models.py:44 153 | msgid "email subject" 154 | msgstr "Sujet du courriel" 155 | 156 | #: models.py:45 157 | msgid "Send uploaded files as email attachments" 158 | msgstr "Joindre les fichiers téléversés aux courriels." 159 | 160 | #: models.py:46 161 | msgid "method" 162 | msgstr "Méthode" 163 | 164 | #: models.py:47 165 | msgid "success message" 166 | msgstr "Message de succès" 167 | 168 | #: models.py:48 169 | msgid "error message" 170 | msgstr "Message d'erreur" 171 | 172 | #: models.py:49 173 | msgid "submit button label" 174 | msgstr "Libellé du bouton d'envoi" 175 | 176 | #: models.py:50 177 | msgid "log form data" 178 | msgstr "Sauver les données" 179 | 180 | #: models.py:50 181 | msgid "Logs all form submissions to the database." 182 | msgstr "Sauver les données saisies dans la base de données." 183 | 184 | #: models.py:51 185 | msgid "save uploaded files" 186 | msgstr "Sauver les fichiers téléversés" 187 | 188 | #: models.py:51 189 | msgid "Saves all uploaded files using server storage." 190 | msgstr "" 191 | "Sauve tous les fichiers téléversés en utilisant la mécanique de stockage du " 192 | "serveur." 193 | 194 | #: models.py:52 195 | msgid "HTTP redirect after successful submission" 196 | msgstr "Redirection HTTP après une soumission réussie " 197 | 198 | #: models.py:53 199 | msgid "clear form after successful submission" 200 | msgstr "Vider les champs après une soumission réussie" 201 | 202 | #: models.py:54 203 | msgid "allow initial values via URL" 204 | msgstr "Permettre l'assignation de valeurs via l'URL" 205 | 206 | #: models.py:54 207 | msgid "" 208 | "If enabled, you can fill in form fields by adding them to the query string." 209 | msgstr "" 210 | "Si activé, vous pouvez populer les champs du formulaire en les ajoutants à " 211 | "la chaîne de requête: Par exemple \"http://chemin.vers/mon/formulaire?" 212 | "prenom=Serge" 213 | 214 | #: models.py:55 215 | msgid "message template" 216 | msgstr "Gabarit de message de courriel" 217 | 218 | #: models.py:55 219 | msgid "" 220 | "Your form fields are available as template context. Example: \"{{ message }}" 221 | "\" if you have a field named `message`. To iterate over all fields, use the " 222 | "variable `data` (a list containing a dictionary for each form field, each " 223 | "containing the elements `name`, `label`, `value`)." 224 | msgstr "" 225 | "Vos champs de formulaire sont accessibles sous forme de variables de " 226 | "gabarits.Par exemple: \"{{ message }}\" si vous avez un champ nommé «" 227 | " message ».Pour itérer sur l'ensemble des champs, " 228 | "utilisez la variables « data » ( une liste " 229 | "de dictionnaires associé à chaque champ avec les clefs « " 230 | "name », « label », « " 231 | "value » )" 232 | 233 | #: models.py:56 234 | msgid "form template" 235 | msgstr "Gabarit de formulaire" 236 | 237 | #: models.py:57 238 | msgid "display logged submissions with form" 239 | msgstr "Afficher les données soumises avec le formulaire" 240 | 241 | #: models.py:61 242 | msgid "Forms" 243 | msgstr "Formulaires" 244 | 245 | #: models.py:116 246 | msgid "Fields" 247 | msgstr "Champs" 248 | 249 | #: models.py:177 250 | msgid "Form log" 251 | msgstr "Entrée de formulaire" 252 | 253 | #: models.py:178 254 | msgid "Form logs" 255 | msgstr "Entrées de formulaire" 256 | 257 | #: models.py:184 258 | msgid "field class" 259 | msgstr "Type de champ" 260 | 261 | #: models.py:185 262 | msgid "position" 263 | msgstr "Position" 264 | 265 | #: models.py:188 266 | msgid "label" 267 | msgstr "Libellé" 268 | 269 | #: models.py:189 270 | msgid "required" 271 | msgstr "Obligatoire" 272 | 273 | #: models.py:190 274 | msgid "include in result" 275 | msgstr "Inclure dans le résultat" 276 | 277 | #: models.py:191 278 | msgid "widget" 279 | msgstr "Widget" 280 | 281 | #: models.py:192 282 | msgid "initial value" 283 | msgstr "Valeur initiale" 284 | 285 | #: models.py:193 286 | msgid "help text" 287 | msgstr "Texte d'aide" 288 | 289 | #: models.py:195 290 | msgid "values" 291 | msgstr "Valeurs" 292 | 293 | #: models.py:195 294 | msgid "One value per line" 295 | msgstr "Une valeur par ligne" 296 | 297 | #: models.py:196 298 | msgid "labels" 299 | msgstr "Libellés" 300 | 301 | #: models.py:196 302 | msgid "One label per line" 303 | msgstr "Un libellé par ligne" 304 | 305 | #: models.py:198 306 | msgid "max. length" 307 | msgstr "Longueur maximale" 308 | 309 | #: models.py:199 310 | msgid "min. length" 311 | msgstr "Longueur minimale" 312 | 313 | #: models.py:200 314 | msgid "max. value" 315 | msgstr "Valeur maximale" 316 | 317 | #: models.py:201 318 | msgid "min. value" 319 | msgstr "Valeur minimale" 320 | 321 | #: models.py:202 322 | msgid "max. digits" 323 | msgstr "Nombre de chiffres maximum" 324 | 325 | #: models.py:203 326 | msgid "decimal places" 327 | msgstr "Nombre de décimales" 328 | 329 | #: models.py:205 330 | msgid "regular Expression" 331 | msgstr "Expression régulière" 332 | 333 | #: models.py:208 334 | msgid "data model" 335 | msgstr "Modèle de données" 336 | 337 | #: models.py:209 338 | msgid "empty label" 339 | msgstr "Libellé vide" 340 | 341 | #: models.py:212 342 | msgid "field" 343 | msgstr "Champ" 344 | 345 | #: models.py:213 346 | msgid "fields" 347 | msgstr "Champs" 348 | 349 | #: settings.py:11 350 | msgid "E-mail address" 351 | msgstr "Adresse courriel" 352 | 353 | #: settings.py:12 354 | msgid "Web address" 355 | msgstr "Adresse Web" 356 | 357 | #: settings.py:13 358 | msgid "Number" 359 | msgstr "Nombre" 360 | 361 | #: settings.py:14 362 | msgid "Decimal number" 363 | msgstr "Nombre décimal" 364 | 365 | #: settings.py:15 366 | msgid "Yes/No" 367 | msgstr "Oui/Non" 368 | 369 | #: settings.py:16 370 | msgid "Date" 371 | msgstr "Date" 372 | 373 | #: settings.py:17 374 | msgid "Date & time" 375 | msgstr "Date et temps" 376 | 377 | #: settings.py:18 378 | msgid "Time" 379 | msgstr "Temps" 380 | 381 | #: settings.py:19 382 | msgid "Choice" 383 | msgstr "Choix" 384 | 385 | #: settings.py:20 386 | msgid "Multiple Choice" 387 | msgstr "Choix Multiple" 388 | 389 | #: settings.py:21 390 | msgid "Model Choice" 391 | msgstr "Choix de Modèle" 392 | 393 | #: settings.py:22 394 | msgid "Model Multiple Choice" 395 | msgstr "Choix Multiple de Modèle" 396 | 397 | #: settings.py:24 398 | msgid "File" 399 | msgstr "Fichier" 400 | 401 | #: settings.py:29 settings.py:37 402 | msgid "Default" 403 | msgstr "Défaut" 404 | 405 | #: settings.py:30 406 | msgid "Text area" 407 | msgstr "Zone de texte" 408 | 409 | #: settings.py:31 410 | msgid "Password input" 411 | msgstr "Champ de saisie de mot de passe" 412 | 413 | #: settings.py:32 414 | msgid "Hidden input" 415 | msgstr "Champ caché" 416 | 417 | #: settings.py:33 418 | msgid "Radio button" 419 | msgstr "Bouton radio" 420 | 421 | #: settings.py:38 422 | msgid "as paragraphs" 423 | msgstr "en paragraphes" 424 | 425 | #: settings.py:39 426 | msgid "as table" 427 | msgstr "en table" 428 | 429 | #: settings.py:40 430 | msgid "as table (horizontal)" 431 | msgstr "en table (horizontale)" 432 | 433 | #: settings.py:41 434 | msgid "as unordered list" 435 | msgstr "en liste non ordonnée (ul)" 436 | 437 | #: settings.py:42 438 | msgid "custom implementation" 439 | msgstr "implémentation personnalisée" 440 | 441 | #: uploads.py:20 442 | msgid "This field is required." 443 | msgstr "Ce champs est obligatoire." 444 | 445 | #: uploads.py:25 446 | msgid "This file type is not allowed." 447 | msgstr "Ce type de fichier n'est pas autorisé." 448 | 449 | #: uploads.py:27 450 | #, python-format 451 | msgid "Please keep file size under %(max_size)s. Current size is %(size)s." 452 | msgstr "" 453 | "Veuillez garder une taille de ficher inférieure à %(max_size)s. " 454 | "La taille actuelle est de %(size)s." 455 | 456 | #: views.py:21 457 | msgid "Thank you, the data was submitted successfully." 458 | msgstr "Merci, les données ont été soumises avec succès." 459 | 460 | #: views.py:22 461 | msgid "The data could not be submitted, please try again." 462 | msgstr "Les données n'ont pas pu être soumises, veuillez essayer de nouveau." 463 | 464 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:13 465 | msgid "Form Designer" 466 | msgstr "" 467 | 468 | #: contrib/cms_plugins/form_designer_form/models.py:8 469 | msgid "form" 470 | msgstr "Formulaire" 471 | 472 | #: templates/admin/form_designer/formlog/change_list.html:9 473 | msgid "Export CSV" 474 | msgstr "Exporter en CSV" 475 | 476 | #: templates/admin/form_designer/formlog/change_list.html:16 477 | msgid "Export XLS" 478 | msgstr "Exporter en XML" 479 | 480 | #: templates/html/formdefinition/forms/includes/submit.html:2 481 | msgid "Submit" 482 | msgstr "Envoyer" 483 | 484 | #: templatetags/friendly.py:18 485 | msgid "yes" 486 | msgstr "oui" 487 | 488 | #: templatetags/friendly.py:18 489 | msgid "no" 490 | msgstr "non" 491 | -------------------------------------------------------------------------------- /form_designer/locale/nl/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/locale/nl/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /form_designer/locale/nl/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: PACKAGE VERSION\n" 4 | "Report-Msgid-Bugs-To: \n" 5 | "POT-Creation-Date: 2013-10-29 18:36+0100\n" 6 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 7 | "Last-Translator: Erik Romijn \n" 8 | "Language-Team: LANGUAGE \n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | 13 | #: admin.py:18 admin.py:30 14 | msgid "Basic" 15 | msgstr "Basis" 16 | 17 | #: admin.py:19 18 | msgid "Display" 19 | msgstr "Weergave" 20 | 21 | #: admin.py:20 settings.py:10 22 | msgid "Text" 23 | msgstr "Tekst" 24 | 25 | #: admin.py:21 26 | msgid "Numbers" 27 | msgstr "Nummers" 28 | 29 | #: admin.py:22 settings.py:23 30 | msgid "Regex" 31 | msgstr "Reguliere expressie" 32 | 33 | #: admin.py:23 34 | msgid "Choices" 35 | msgstr "Keuzes" 36 | 37 | #: admin.py:24 38 | msgid "Model Choices" 39 | msgstr "Model-keuzes" 40 | 41 | #: admin.py:31 42 | msgid "Settings" 43 | msgstr "" 44 | 45 | #: admin.py:32 46 | msgid "Mail form" 47 | msgstr "Mail-formulier" 48 | 49 | #: admin.py:33 50 | msgid "Templates" 51 | msgstr "Sjablonen" 52 | 53 | #: admin.py:34 54 | msgid "Messages" 55 | msgstr "Berichten" 56 | 57 | #: admin.py:63 58 | #, fuzzy, python-format 59 | msgid "Export selected %%(verbose_name_plural)s as %s" 60 | msgstr "Exporteer geselecteerde %(verbose_name_plural) als CSV" 61 | 62 | #: admin.py:73 models.py:62 63 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:14 64 | #: contrib/exporters/__init__.py:58 65 | msgid "Form" 66 | msgstr "Formulier" 67 | 68 | #: admin.py:84 69 | msgid "Data" 70 | msgstr "Data" 71 | 72 | #: admin.py:108 73 | #, python-format 74 | msgid "Export view as %s" 75 | msgstr "Exporteer view als %s" 76 | 77 | #: forms.py:44 78 | msgid "This field class requires a regular expression." 79 | msgstr "Deze veldklasse vereist een reguliere expressie." 80 | 81 | #: forms.py:49 82 | msgid "This field class requires a model." 83 | msgstr "Deze veldklasse vereist een model." 84 | 85 | #: models.py:37 models.py:187 86 | msgid "name" 87 | msgstr "Naam" 88 | 89 | #: models.py:38 90 | msgid "obfuscate URL to this form" 91 | msgstr "verberg URL naar dit formulier" 92 | 93 | #: models.py:38 94 | msgid "If enabled, the form can only be reached via a secret URL." 95 | msgstr "" 96 | "Indien actief, kan het formulier enkel bezocht worden via een geheime URL." 97 | 98 | #: models.py:41 99 | msgid "title" 100 | msgstr "Titel" 101 | 102 | #: models.py:42 103 | msgid "body" 104 | msgstr "" 105 | 106 | #: models.py:43 107 | msgid "target URL" 108 | msgstr "Doel-URL" 109 | 110 | #: models.py:43 111 | msgid "" 112 | "If you leave this empty, the page where the form resides will be requested, " 113 | "and you can use the mail form and logging features. You can also send data " 114 | "to external sites: For instance, enter \"http://www.google.ch/search\" to " 115 | "create a search form." 116 | msgstr "" 117 | "Als u dit leeg laat, wordt de pagina waar het formulier zich bevindt " 118 | "opgevraagd en kan u de e-mail en log-functies gebruiken. U kunt ook data " 119 | "naar externe sites versturen. Bijvoorbeeld, voer \"http://www.google.com/" 120 | "search\" in om een zoekformulier aan te maken. " 121 | 122 | #: models.py:44 123 | msgid "send form data to e-mail address" 124 | msgstr "Formuliergegevens naar e-mail-adres sturen" 125 | 126 | #: models.py:45 127 | msgid "sender address" 128 | msgstr "Afzender-adres" 129 | 130 | #: models.py:46 131 | msgid "email subject" 132 | msgstr "E-mail-onderwerp" 133 | 134 | #: models.py:47 135 | msgid "Send uploaded files as email attachments" 136 | msgstr "Verstuur geüploade bestanden als mailbijlages" 137 | 138 | #: models.py:48 139 | msgid "method" 140 | msgstr "Methode" 141 | 142 | #: models.py:49 143 | msgid "success message" 144 | msgstr "Successmelding" 145 | 146 | #: models.py:50 147 | msgid "error message" 148 | msgstr "Foutmelding" 149 | 150 | #: models.py:51 151 | msgid "submit button label" 152 | msgstr "Label voor de verzendknop" 153 | 154 | #: models.py:52 155 | msgid "log form data" 156 | msgstr "Formulierdata loggen" 157 | 158 | #: models.py:52 159 | msgid "Logs all form submissions to the database." 160 | msgstr "Log alle formulierinsturingen in de database." 161 | 162 | #: models.py:53 163 | msgid "save uploaded files" 164 | msgstr "bewaar geüploade bestanden" 165 | 166 | #: models.py:53 167 | msgid "Saves all uploaded files using server storage." 168 | msgstr "Bewaart alle geüploade bestanden op de server." 169 | 170 | #: models.py:54 171 | msgid "HTTP redirect after successful submission" 172 | msgstr "Doorsturen na success" 173 | 174 | #: models.py:55 175 | msgid "clear form after successful submission" 176 | msgstr "Na succesvol versturen formulier leegmaken" 177 | 178 | #: models.py:56 179 | msgid "allow initial values via URL" 180 | msgstr "Initiële waarden via de URL toelaten" 181 | 182 | #: models.py:56 183 | msgid "" 184 | "If enabled, you can fill in form fields by adding them to the query string." 185 | msgstr "" 186 | "Indien geactiveerd, kunt u formuliervelden invullen door deze aan de query-" 187 | "string toe te voegen. " 188 | 189 | #: models.py:57 190 | msgid "message template" 191 | msgstr "Berichtsjabloon" 192 | 193 | #: models.py:57 194 | msgid "" 195 | "Your form fields are available as template context. Example: \"{{ message }}" 196 | "\" if you have a field named `message`. To iterate over all fields, use the " 197 | "variable `data` (a list containing a dictionary for each form field, each " 198 | "containing the elements `name`, `label`, `value`)." 199 | msgstr "" 200 | "Uw formuliervelden zijn beschikbaar als template context. Bijvoorbeeld: " 201 | "\"{{ bericht }}\" als u een veld genaamd `bericht` heeft. Om over alle " 202 | "velden te itereren, gebruikt u de variabele `data`: een lijst met een dict " 203 | "voor elk veld met de elementen `name`, `label` en `value`." 204 | 205 | #: models.py:58 206 | msgid "form template" 207 | msgstr "Formulier-sjabloon" 208 | 209 | #: models.py:59 210 | msgid "display logged submissions with form" 211 | msgstr "toon gelogde inzendingen met dit formulier" 212 | 213 | #: models.py:63 214 | msgid "Forms" 215 | msgstr "Formulieren" 216 | 217 | #: models.py:123 218 | msgid "Fields" 219 | msgstr "Velden" 220 | 221 | #: models.py:184 222 | msgid "field class" 223 | msgstr "Veldklasse" 224 | 225 | #: models.py:185 226 | msgid "position" 227 | msgstr "Positie" 228 | 229 | #: models.py:188 230 | msgid "label" 231 | msgstr "Label" 232 | 233 | #: models.py:189 234 | msgid "required" 235 | msgstr "Vereist" 236 | 237 | #: models.py:190 238 | msgid "include in result" 239 | msgstr "In resultaat plaatsen" 240 | 241 | #: models.py:191 242 | msgid "widget" 243 | msgstr "Widget" 244 | 245 | #: models.py:192 246 | msgid "initial value" 247 | msgstr "Initiële waarde" 248 | 249 | #: models.py:193 250 | msgid "help text" 251 | msgstr "Hulptekst" 252 | 253 | #: models.py:195 254 | msgid "values" 255 | msgstr "Waardes" 256 | 257 | #: models.py:195 258 | msgid "One value per line" 259 | msgstr "Eén waarde per regel" 260 | 261 | #: models.py:196 262 | msgid "labels" 263 | msgstr "Labels" 264 | 265 | #: models.py:196 266 | msgid "One label per line" 267 | msgstr "Eén label per regel" 268 | 269 | #: models.py:198 270 | msgid "max. length" 271 | msgstr "Max. lengte" 272 | 273 | #: models.py:199 274 | msgid "min. length" 275 | msgstr "Min. lengte" 276 | 277 | #: models.py:200 278 | msgid "max. value" 279 | msgstr "Max. waarde" 280 | 281 | #: models.py:201 282 | msgid "min. value" 283 | msgstr "Min. waarde" 284 | 285 | #: models.py:202 286 | msgid "max. digits" 287 | msgstr "Max. aantal cijfers" 288 | 289 | #: models.py:203 290 | msgid "decimal places" 291 | msgstr "Decimalen" 292 | 293 | #: models.py:205 294 | msgid "regular Expression" 295 | msgstr "Reguliere expressie" 296 | 297 | #: models.py:208 298 | msgid "data model" 299 | msgstr "Datamodel" 300 | 301 | #: models.py:209 302 | msgid "empty label" 303 | msgstr "Leeg label" 304 | 305 | #: models.py:212 306 | msgid "field" 307 | msgstr "Veld" 308 | 309 | #: models.py:213 310 | msgid "fields" 311 | msgstr "Velden" 312 | 313 | #: models.py:304 contrib/exporters/__init__.py:60 314 | msgid "Created" 315 | msgstr "Aangemaakt" 316 | 317 | #: models.py:370 318 | #, fuzzy 319 | msgid "field name" 320 | msgstr "Veldklasse" 321 | 322 | #: models.py:374 models.py:379 323 | #, fuzzy 324 | msgid "value" 325 | msgstr "Waardes" 326 | 327 | #: settings.py:11 328 | msgid "E-mail address" 329 | msgstr "E-mail-adres" 330 | 331 | #: settings.py:12 332 | msgid "Web address" 333 | msgstr "Web-adres" 334 | 335 | #: settings.py:13 336 | msgid "Number" 337 | msgstr "Nummer" 338 | 339 | #: settings.py:14 340 | msgid "Decimal number" 341 | msgstr "Decimaal nummer" 342 | 343 | #: settings.py:15 344 | msgid "Yes/No" 345 | msgstr "Ja/Nee" 346 | 347 | #: settings.py:16 348 | msgid "Date" 349 | msgstr "Datum" 350 | 351 | #: settings.py:17 352 | msgid "Date & time" 353 | msgstr "Datum & tijd" 354 | 355 | #: settings.py:18 356 | msgid "Time" 357 | msgstr "Tijd" 358 | 359 | #: settings.py:19 360 | msgid "Choice" 361 | msgstr "Keuze" 362 | 363 | #: settings.py:20 364 | msgid "Multiple Choice" 365 | msgstr "Meerkeuze" 366 | 367 | #: settings.py:21 368 | msgid "Model Choice" 369 | msgstr "Model-keuze" 370 | 371 | #: settings.py:22 372 | msgid "Model Multiple Choice" 373 | msgstr "Model-meerkeuze" 374 | 375 | #: settings.py:24 376 | msgid "File" 377 | msgstr "Veld" 378 | 379 | #: settings.py:29 settings.py:42 380 | msgid "Default" 381 | msgstr "Standaard" 382 | 383 | #: settings.py:30 384 | msgid "Text area" 385 | msgstr "Tekstveld" 386 | 387 | #: settings.py:31 388 | msgid "Password input" 389 | msgstr "Wachtwoordveld" 390 | 391 | #: settings.py:32 392 | msgid "Hidden input" 393 | msgstr "Verborgen veld" 394 | 395 | #: settings.py:33 396 | msgid "Radio button" 397 | msgstr "Keuzerondje" 398 | 399 | #: settings.py:43 400 | msgid "as paragraphs" 401 | msgstr "als paragraaf" 402 | 403 | #: settings.py:44 404 | msgid "as table" 405 | msgstr "als tabel" 406 | 407 | #: settings.py:45 408 | msgid "as table (horizontal)" 409 | msgstr "als tabel (horizontaal)" 410 | 411 | #: settings.py:46 412 | msgid "as unordered list" 413 | msgstr "als ongesorteerde lijst" 414 | 415 | #: settings.py:47 416 | msgid "custom implementation" 417 | msgstr "eigen implementatie" 418 | 419 | #: uploads.py:20 420 | msgid "This field is required." 421 | msgstr "Dit veld is verplicht." 422 | 423 | #: uploads.py:25 424 | msgid "This file type is not allowed." 425 | msgstr "Dit type veld is niet toegestaan." 426 | 427 | #: uploads.py:27 428 | #, python-format 429 | msgid "Please keep file size under %(max_size)s. Current size is %(size)s." 430 | msgstr "" 431 | "Beperk de bestandsgrootte tot maximum %(max_size)s. Huidige bestandsgrootte " 432 | "is %(size)s." 433 | 434 | #: views.py:21 435 | msgid "Thank you, the data was submitted successfully." 436 | msgstr "Hartelijk dank. Uw gegevens zijn doorgestuurd." 437 | 438 | #: views.py:22 439 | msgid "The data could not be submitted, please try again." 440 | msgstr "De gegevens konden niet opgestuurd worden, probeert u het opnieuw." 441 | 442 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:13 443 | msgid "Form Designer" 444 | msgstr "" 445 | 446 | #: contrib/cms_plugins/form_designer_form/models.py:8 447 | msgid "form" 448 | msgstr "Formulier" 449 | 450 | #: contrib/exporters/__init__.py:62 451 | msgid "ID" 452 | msgstr "ID" 453 | 454 | #: templates/html/formdefinition/forms/includes/submit.html:2 455 | msgid "Submit" 456 | msgstr "Verzenden" 457 | 458 | #: templatetags/friendly.py:20 459 | msgid "yes" 460 | msgstr "ja" 461 | 462 | #: templatetags/friendly.py:20 463 | msgid "no" 464 | msgstr "nee" 465 | 466 | #, fuzzy 467 | #~ msgid "Export selected %(verbose_name_plural)s as XLS" 468 | #~ msgstr "Exporteer geselecteerde %(verbose_name_plural) als Excel XLS" 469 | 470 | #~ msgid "CSV export is not enabled." 471 | #~ msgstr "CSV-exporteren is niet geäctiveerd." 472 | 473 | #~ msgid "XLS export is not enabled." 474 | #~ msgstr "XLS-exporteren is niet geäctiveerd." 475 | 476 | #~ msgid "Form log" 477 | #~ msgstr "Formulier-log" 478 | 479 | #~ msgid "Form logs" 480 | #~ msgstr "Formulier-logs" 481 | 482 | #~ msgid "Export CSV" 483 | #~ msgstr "CSV exporteren" 484 | 485 | #~ msgid "Export XLS" 486 | #~ msgstr "XLS exporteren" 487 | -------------------------------------------------------------------------------- /form_designer/locale/pt_BR/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/locale/pt_BR/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /form_designer/locale/pt_BR/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2013-02-14 16:13-0200\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n > 1)\n" 20 | 21 | #: admin.py:18 admin.py:30 22 | msgid "Basic" 23 | msgstr "Básico" 24 | 25 | #: admin.py:19 26 | msgid "Display" 27 | msgstr "" 28 | 29 | #: admin.py:20 settings.py:10 30 | msgid "Text" 31 | msgstr "Texto" 32 | 33 | #: admin.py:21 34 | msgid "Numbers" 35 | msgstr "Números" 36 | 37 | #: admin.py:22 settings.py:23 38 | msgid "Regex" 39 | msgstr "Expressão Regular" 40 | 41 | #: admin.py:23 42 | msgid "Choices" 43 | msgstr "Escolhas" 44 | 45 | #: admin.py:24 46 | msgid "Model Choices" 47 | msgstr "" 48 | 49 | #: admin.py:31 50 | msgid "Settings" 51 | msgstr "Configurações" 52 | 53 | #: admin.py:32 54 | msgid "Mail form" 55 | msgstr "Formulário de Email" 56 | 57 | #: admin.py:33 58 | msgid "Templates" 59 | msgstr "" 60 | 61 | #: admin.py:34 62 | msgid "Messages" 63 | msgstr "Mensagens" 64 | 65 | #: admin.py:63 66 | #, python-format 67 | msgid "Export selected %%(verbose_name_plural)s as %s" 68 | msgstr "Exportar %%(verbose_name_plural)s selecionado como %s" 69 | 70 | #: admin.py:73 models.py:55 71 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:14 72 | #: contrib/exporters/__init__.py:58 73 | msgid "Form" 74 | msgstr "Formulário" 75 | 76 | #: admin.py:84 77 | msgid "Data" 78 | msgstr "Dados" 79 | 80 | #: admin.py:108 81 | #, python-format 82 | msgid "Export view as %s" 83 | msgstr "Exportar view como %s" 84 | 85 | #: forms.py:44 86 | msgid "This field class requires a regular expression." 87 | msgstr "Esta classe de campo requer uma expressão regular" 88 | 89 | #: forms.py:49 90 | msgid "This field class requires a model." 91 | msgstr "Esta classe de campo requer um model" 92 | 93 | #: models.py:30 models.py:180 94 | msgid "name" 95 | msgstr "nome" 96 | 97 | #: models.py:31 98 | msgid "obfuscate URL to this form" 99 | msgstr "ofuscar URL para esse form" 100 | 101 | #: models.py:31 102 | msgid "If enabled, the form can only be reached via a secret URL." 103 | msgstr "Se habilitado, o formulário só poderá ser alcançado via uma URL secreta." 104 | 105 | #: models.py:34 106 | msgid "title" 107 | msgstr "título" 108 | 109 | #: models.py:35 110 | msgid "body" 111 | msgstr "corpo" 112 | 113 | #: models.py:36 114 | msgid "target URL" 115 | msgstr "URL alvo" 116 | 117 | #: models.py:36 118 | msgid "" 119 | "If you leave this empty, the page where the form resides will be requested, " 120 | "and you can use the mail form and logging features. You can also send data " 121 | "to external sites: For instance, enter \"http://www.google.ch/search\" to " 122 | "create a search form." 123 | msgstr "" 124 | "Se você o deixar vazio, a página onde o formulário reside será requisitada, " 125 | "e você pode usar o formulário de email e ferramentas de registro. Você pode também enviar dados" 126 | "para sites externos: Por exemplo, coloque \"http://www.google.com.br/search\" para " 127 | "crear um formulário de pesquisa." 128 | 129 | 130 | #: models.py:37 131 | msgid "send form data to e-mail address" 132 | msgstr "enviar os dados do formulário para o endereço de email" 133 | 134 | #: models.py:38 135 | msgid "sender address" 136 | msgstr "endereço do remetente" 137 | 138 | #: models.py:39 139 | msgid "email subject" 140 | msgstr "assunto do email" 141 | 142 | #: models.py:40 143 | msgid "Send uploaded files as email attachments" 144 | msgstr "Enviar arquivos como anexos do email" 145 | 146 | #: models.py:41 147 | msgid "method" 148 | msgstr "método" 149 | 150 | #: models.py:42 151 | msgid "success message" 152 | msgstr "mensagem de sucesso" 153 | 154 | #: models.py:43 155 | msgid "error message" 156 | msgstr "mensagem de erro" 157 | 158 | #: models.py:44 159 | msgid "submit button label" 160 | msgstr "texto do botão de submit" 161 | 162 | #: models.py:45 163 | msgid "log form data" 164 | msgstr "registrar dados do formulário" 165 | 166 | #: models.py:45 167 | msgid "Logs all form submissions to the database." 168 | msgstr "Registrar no banco de dados todos os envios de formulário." 169 | 170 | #: models.py:46 171 | msgid "save uploaded files" 172 | msgstr "salvar arquivos enviados" 173 | 174 | #: models.py:46 175 | msgid "Saves all uploaded files using server storage." 176 | msgstr "Salvar todos os arquivos enviados usando um server storage." 177 | 178 | #: models.py:47 179 | msgid "HTTP redirect after successful submission" 180 | msgstr "Executar um HTTP redirect depois do envio com sucesso de um formulário" 181 | 182 | #: models.py:48 183 | msgid "clear form after successful submission" 184 | msgstr "limpar o formulário depois de um envio de sucesso" 185 | 186 | #: models.py:49 187 | msgid "allow initial values via URL" 188 | msgstr "permitir valores iniciais via URL" 189 | 190 | #: models.py:49 191 | msgid "" 192 | "If enabled, you can fill in form fields by adding them to the query string." 193 | msgstr "Se habilitado, você pode preencher os campos do formulário adicionando seus valores à query string" 194 | 195 | #: models.py:50 196 | msgid "message template" 197 | msgstr "template de mensagem" 198 | 199 | #: models.py:50 200 | msgid "" 201 | "Your form fields are available as template context. Example: " 202 | "\"{{ message }}\" if you have a field named `message`. To iterate over all " 203 | "fields, use the variable `data` (a list containing a dictionary for each " 204 | "form field, each containing the elements `name`, `label`, `value`)." 205 | msgstr "" 206 | "Seus campos de formulário são disponíveis no contexto da template. Exemplo:" 207 | "\"{{ message }}\" se você possui um campo nomeado `message`. Para iterar sobre todos " 208 | "os campos, use a variável `data` (uma lista contendo um dicionário para cada " 209 | "campo de formulário, os quais contém, por sua vez, os elementos `name`, `label`, " 210 | "`value`)." 211 | 212 | #: models.py:51 213 | msgid "form template" 214 | msgstr "template de formulário" 215 | 216 | #: models.py:52 217 | msgid "display logged submissions with form" 218 | msgstr "mostrar registros de envio com o form" 219 | 220 | #: models.py:56 221 | msgid "Forms" 222 | msgstr "Formulários" 223 | 224 | #: models.py:116 225 | msgid "Fields" 226 | msgstr "Campos" 227 | 228 | #: models.py:177 229 | msgid "field class" 230 | msgstr "classe do campo" 231 | 232 | #: models.py:178 233 | msgid "position" 234 | msgstr "posição" 235 | 236 | #: models.py:181 237 | msgid "label" 238 | msgstr "" 239 | 240 | #: models.py:182 241 | msgid "required" 242 | msgstr "obrigatório" 243 | 244 | #: models.py:183 245 | msgid "include in result" 246 | msgstr "incluído no resultado" 247 | 248 | #: models.py:184 249 | msgid "widget" 250 | msgstr "" 251 | 252 | #: models.py:185 253 | msgid "initial value" 254 | msgstr "valor inicial" 255 | 256 | #: models.py:186 257 | msgid "help text" 258 | msgstr "texto de ajuda" 259 | 260 | #: models.py:188 261 | msgid "values" 262 | msgstr "valores" 263 | 264 | #: models.py:188 265 | msgid "One value per line" 266 | msgstr "Um valor por linha" 267 | 268 | #: models.py:189 269 | msgid "labels" 270 | msgstr "" 271 | 272 | #: models.py:189 273 | msgid "One label per line" 274 | msgstr "Um label por linha" 275 | 276 | #: models.py:191 277 | msgid "max. length" 278 | msgstr "valor máximo" 279 | 280 | #: models.py:192 281 | msgid "min. length" 282 | msgstr "valor mínimo" 283 | 284 | #: models.py:193 285 | msgid "max. value" 286 | msgstr "valor máximo" 287 | 288 | #: models.py:194 289 | msgid "min. value" 290 | msgstr "valor mínimo" 291 | 292 | #: models.py:195 293 | msgid "max. digits" 294 | msgstr "máximo de dígitos" 295 | 296 | #: models.py:196 297 | msgid "decimal places" 298 | msgstr "casas decimais" 299 | 300 | #: models.py:198 301 | msgid "regular Expression" 302 | msgstr "expressão regular" 303 | 304 | #: models.py:201 305 | msgid "data model" 306 | msgstr "modelo de dados" 307 | 308 | #: models.py:202 309 | msgid "empty label" 310 | msgstr "label vazio" 311 | 312 | #: models.py:205 313 | msgid "field" 314 | msgstr "campo" 315 | 316 | #: models.py:206 317 | msgid "fields" 318 | msgstr "campos" 319 | 320 | #: models.py:297 contrib/exporters/__init__.py:60 321 | msgid "Created" 322 | msgstr "Criado" 323 | 324 | #: models.py:363 325 | msgid "field name" 326 | msgstr "nome do campo" 327 | 328 | #: models.py:367 models.py:372 329 | msgid "value" 330 | msgstr "valor" 331 | 332 | #: settings.py:11 333 | msgid "E-mail address" 334 | msgstr "Endereço de email" 335 | 336 | #: settings.py:12 337 | msgid "Web address" 338 | msgstr "Endereço Web" 339 | 340 | #: settings.py:13 341 | msgid "Number" 342 | msgstr "Número" 343 | 344 | #: settings.py:14 345 | msgid "Decimal number" 346 | msgstr "Número Decimal" 347 | 348 | #: settings.py:15 349 | msgid "Yes/No" 350 | msgstr "Sim/Não" 351 | 352 | #: settings.py:16 353 | msgid "Date" 354 | msgstr "Data" 355 | 356 | #: settings.py:17 357 | msgid "Date & time" 358 | msgstr "Data & hora" 359 | 360 | #: settings.py:18 361 | msgid "Time" 362 | msgstr "Hora" 363 | 364 | #: settings.py:19 365 | msgid "Choice" 366 | msgstr "Escolha" 367 | 368 | #: settings.py:20 369 | msgid "Multiple Choice" 370 | msgstr "Escolha Múltipla" 371 | 372 | #: settings.py:21 373 | msgid "Model Choice" 374 | msgstr "" 375 | 376 | #: settings.py:22 377 | msgid "Model Multiple Choice" 378 | msgstr "" 379 | 380 | #: settings.py:24 381 | msgid "File" 382 | msgstr "Arquivo" 383 | 384 | #: settings.py:29 settings.py:42 385 | msgid "Default" 386 | msgstr "" 387 | 388 | #: settings.py:30 389 | msgid "Text area" 390 | msgstr "" 391 | 392 | #: settings.py:31 393 | msgid "Password input" 394 | msgstr "" 395 | 396 | #: settings.py:32 397 | msgid "Hidden input" 398 | msgstr "" 399 | 400 | #: settings.py:33 401 | msgid "Radio button" 402 | msgstr "" 403 | 404 | #: settings.py:43 405 | msgid "as paragraphs" 406 | msgstr "como parágrafos" 407 | 408 | #: settings.py:44 409 | msgid "as table" 410 | msgstr "como tabela" 411 | 412 | #: settings.py:45 413 | msgid "as table (horizontal)" 414 | msgstr "como tabela (horizontal)" 415 | 416 | #: settings.py:46 417 | msgid "as unordered list" 418 | msgstr "como lista não ordenada" 419 | 420 | #: settings.py:47 421 | msgid "custom implementation" 422 | msgstr "implementação customizada" 423 | 424 | #: uploads.py:20 425 | msgid "This field is required." 426 | msgstr "Este campo é obrigatório" 427 | 428 | #: uploads.py:25 429 | msgid "This file type is not allowed." 430 | msgstr "Este tipo de arquivo não é permitido" 431 | 432 | #: uploads.py:27 433 | #, python-format 434 | msgid "Please keep file size under %(max_size)s. Current size is %(size)s." 435 | msgstr "" 436 | "Por favor, informe um arquivo menor que %(max_size)s. O tamanho do arquivo " 437 | "enviado é %(size)s." 438 | 439 | #: views.py:21 440 | msgid "Thank you, the data was submitted successfully." 441 | msgstr "Obrigado, os dados foram enviados com sucesso." 442 | 443 | #: views.py:22 444 | msgid "The data could not be submitted, please try again." 445 | msgstr "Os dados não puderam ser enviados, por favor, tente novamente." 446 | 447 | #: contrib/cms_plugins/form_designer_form/cms_plugins.py:13 448 | msgid "Form Designer" 449 | msgstr "" 450 | 451 | #: contrib/cms_plugins/form_designer_form/models.py:8 452 | msgid "form" 453 | msgstr "formulário" 454 | 455 | #: contrib/exporters/__init__.py:62 456 | msgid "ID" 457 | msgstr "" 458 | 459 | #: templates/html/formdefinition/forms/includes/submit.html:2 460 | msgid "Submit" 461 | msgstr "Enviar" 462 | 463 | #: templatetags/friendly.py:20 464 | msgid "yes" 465 | msgstr "sim" 466 | 467 | #: templatetags/friendly.py:20 468 | msgid "no" 469 | msgstr "não" 470 | -------------------------------------------------------------------------------- /form_designer/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import SchemaMigration 8 | from django.db import models 9 | 10 | class Migration(SchemaMigration): 11 | 12 | def forwards(self, orm): 13 | 14 | # Adding model 'FormDefinition' 15 | db.create_table('form_designer_formdefinition', ( 16 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 17 | ('name', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255, db_index=True)), 18 | ('title', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 19 | ('action', self.gf('django.db.models.fields.URLField')(max_length=255, null=True, blank=True)), 20 | ('mail_to', self.gf('form_designer.fields.TemplateCharField')(max_length=255, null=True, blank=True)), 21 | ('mail_from', self.gf('form_designer.fields.TemplateCharField')(max_length=255, null=True, blank=True)), 22 | ('mail_subject', self.gf('form_designer.fields.TemplateCharField')(max_length=255, null=True, blank=True)), 23 | ('method', self.gf('django.db.models.fields.CharField')(default='POST', max_length=10)), 24 | ('success_message', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 25 | ('error_message', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 26 | ('submit_label', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 27 | ('log_data', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)), 28 | ('success_redirect', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), 29 | ('success_clear', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)), 30 | ('allow_get_initial', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)), 31 | ('message_template', self.gf('form_designer.fields.TemplateTextField')(null=True, blank=True)), 32 | ('form_template_name', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 33 | )) 34 | db.send_create_signal('form_designer', ['FormDefinition']) 35 | 36 | # Adding model 'FormLog' 37 | db.create_table('form_designer_formlog', ( 38 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 39 | ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), 40 | ('form_definition', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['form_designer.FormDefinition'])), 41 | ('data', self.gf(DATA_FIELD_TYPE)(null=True, blank=True)), 42 | )) 43 | db.send_create_signal('form_designer', ['FormLog']) 44 | 45 | # Adding model 'FormDefinitionField' 46 | db.create_table('form_designer_formdefinitionfield', ( 47 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 48 | ('form_definition', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['form_designer.FormDefinition'])), 49 | ('field_class', self.gf('django.db.models.fields.CharField')(max_length=32)), 50 | ('position', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), 51 | ('name', self.gf('django.db.models.fields.SlugField')(max_length=255, db_index=True)), 52 | ('label', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 53 | ('required', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)), 54 | ('include_result', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)), 55 | ('widget', self.gf('django.db.models.fields.CharField')(default='', max_length=255, null=True, blank=True)), 56 | ('initial', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 57 | ('help_text', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 58 | ('choice_values', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), 59 | ('choice_labels', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), 60 | ('max_length', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), 61 | ('min_length', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), 62 | ('max_value', self.gf('django.db.models.fields.FloatField')(null=True, blank=True)), 63 | ('min_value', self.gf('django.db.models.fields.FloatField')(null=True, blank=True)), 64 | ('max_digits', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), 65 | ('decimal_places', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), 66 | ('regex', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 67 | ('choice_model', self.gf('form_designer.fields.ModelNameField')(max_length=255, null=True, blank=True)), 68 | ('choice_model_empty_label', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), 69 | )) 70 | db.send_create_signal('form_designer', ['FormDefinitionField']) 71 | 72 | 73 | def backwards(self, orm): 74 | 75 | # Deleting model 'FormDefinition' 76 | db.delete_table('form_designer_formdefinition') 77 | 78 | # Deleting model 'FormLog' 79 | db.delete_table('form_designer_formlog') 80 | 81 | # Deleting model 'FormDefinitionField' 82 | db.delete_table('form_designer_formdefinitionfield') 83 | 84 | 85 | models = { 86 | 'form_designer.formdefinition': { 87 | 'Meta': {'object_name': 'FormDefinition'}, 88 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 89 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 90 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 91 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 92 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 93 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 94 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 95 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 96 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 97 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 98 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 99 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), 100 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 101 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 102 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 103 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 104 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 105 | }, 106 | 'form_designer.formdefinitionfield': { 107 | 'Meta': {'object_name': 'FormDefinitionField'}, 108 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 109 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 110 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 111 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 112 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 113 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 114 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 115 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 116 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 117 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 118 | 'initial': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 119 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 120 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 121 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 122 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 123 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 124 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 125 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 126 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 127 | 'regex': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 128 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 129 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 130 | }, 131 | 'form_designer.formlog': { 132 | 'Meta': {'object_name': 'FormLog'}, 133 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 134 | 'data': (DATA_FIELD_TYPE, [], {'null': 'True', 'blank': 'True'}), 135 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 136 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 137 | } 138 | } 139 | 140 | complete_apps = ['form_designer'] 141 | -------------------------------------------------------------------------------- /form_designer/migrations/0002_auto__chg_field_formdefinitionfield_initial.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import SchemaMigration 8 | from django.db import models 9 | 10 | class Migration(SchemaMigration): 11 | 12 | def forwards(self, orm): 13 | 14 | # Changing field 'FormDefinitionField.initial' 15 | db.alter_column('form_designer_formdefinitionfield', 'initial', self.gf('django.db.models.fields.TextField')(null=True, blank=True)) 16 | 17 | 18 | def backwards(self, orm): 19 | 20 | # Changing field 'FormDefinitionField.initial' 21 | db.alter_column('form_designer_formdefinitionfield', 'initial', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)) 22 | 23 | 24 | models = { 25 | 'form_designer.formdefinition': { 26 | 'Meta': {'object_name': 'FormDefinition'}, 27 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 28 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 29 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 30 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 31 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 32 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 33 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 34 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 35 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 36 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 37 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 38 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), 39 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 40 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 41 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 42 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 43 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 44 | }, 45 | 'form_designer.formdefinitionfield': { 46 | 'Meta': {'object_name': 'FormDefinitionField'}, 47 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 48 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 49 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 50 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 51 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 52 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 53 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 54 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 55 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 56 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 57 | 'initial': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 58 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 59 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 60 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 61 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 62 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 63 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 64 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 65 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 66 | 'regex': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 67 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 68 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 69 | }, 70 | 'form_designer.formlog': { 71 | 'Meta': {'object_name': 'FormLog'}, 72 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 73 | 'data': (DATA_FIELD_TYPE, [], {'null': 'True', 'blank': 'True'}), 74 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 75 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 76 | } 77 | } 78 | 79 | complete_apps = ['form_designer'] 80 | -------------------------------------------------------------------------------- /form_designer/migrations/0003_auto__add_field_formdefinition_display_logged.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import SchemaMigration 8 | from django.db import models 9 | 10 | class Migration(SchemaMigration): 11 | 12 | def forwards(self, orm): 13 | 14 | # Adding field 'FormDefinition.display_logged' 15 | db.add_column('form_designer_formdefinition', 'display_logged', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True), keep_default=False) 16 | 17 | 18 | def backwards(self, orm): 19 | 20 | # Deleting field 'FormDefinition.display_logged' 21 | db.delete_column('form_designer_formdefinition', 'display_logged') 22 | 23 | 24 | models = { 25 | 'form_designer.formdefinition': { 26 | 'Meta': {'object_name': 'FormDefinition'}, 27 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 28 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 29 | 'display_logged': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 30 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 31 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 32 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 33 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 34 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 35 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 36 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 37 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 38 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 39 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), 40 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 41 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 42 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 43 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 44 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 45 | }, 46 | 'form_designer.formdefinitionfield': { 47 | 'Meta': {'object_name': 'FormDefinitionField'}, 48 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 49 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 50 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 51 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 52 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 53 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 54 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 55 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 56 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 57 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 58 | 'initial': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 59 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 60 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 61 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 62 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 63 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 64 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 65 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 66 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 67 | 'regex': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 68 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 69 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 70 | }, 71 | 'form_designer.formlog': { 72 | 'Meta': {'object_name': 'FormLog'}, 73 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 74 | 'data': (DATA_FIELD_TYPE, [], {'null': 'True', 'blank': 'True'}), 75 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 76 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 77 | } 78 | } 79 | 80 | complete_apps = ['form_designer'] 81 | -------------------------------------------------------------------------------- /form_designer/migrations/0004_auto__add_field_formdefinition_body.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import SchemaMigration 8 | from django.db import models 9 | 10 | class Migration(SchemaMigration): 11 | 12 | def forwards(self, orm): 13 | 14 | # Adding field 'FormDefinition.body' 15 | db.add_column('form_designer_formdefinition', 'body', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False) 16 | 17 | 18 | def backwards(self, orm): 19 | 20 | # Deleting field 'FormDefinition.body' 21 | db.delete_column('form_designer_formdefinition', 'body') 22 | 23 | 24 | models = { 25 | 'form_designer.formdefinition': { 26 | 'Meta': {'object_name': 'FormDefinition'}, 27 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 28 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 29 | 'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 30 | 'display_logged': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 31 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 32 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 33 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 34 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 35 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 36 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 37 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 38 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 39 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 40 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), 41 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 42 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 43 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 44 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 45 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 46 | }, 47 | 'form_designer.formdefinitionfield': { 48 | 'Meta': {'object_name': 'FormDefinitionField'}, 49 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 50 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 51 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 52 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 53 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 54 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 55 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 56 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 57 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 58 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 59 | 'initial': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 60 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 61 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 62 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 63 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 64 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 65 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 66 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 67 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 68 | 'regex': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 69 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 70 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 71 | }, 72 | 'form_designer.formlog': { 73 | 'Meta': {'object_name': 'FormLog'}, 74 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 75 | 'data': (DATA_FIELD_TYPE, [], {'null': 'True', 'blank': 'True'}), 76 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 77 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 78 | } 79 | } 80 | 81 | complete_apps = ['form_designer'] 82 | -------------------------------------------------------------------------------- /form_designer/migrations/0005_auto__add_field_formdefinition_require_hash__add_field_formdefinition_.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import SchemaMigration 8 | from django.db import models 9 | 10 | class Migration(SchemaMigration): 11 | 12 | def forwards(self, orm): 13 | 14 | # Adding field 'FormDefinition.require_hash' 15 | db.add_column('form_designer_formdefinition', 'require_hash', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True), keep_default=False) 16 | 17 | # Adding field 'FormDefinition.private_hash' 18 | db.add_column('form_designer_formdefinition', 'private_hash', self.gf('django.db.models.fields.CharField')(default='', max_length=40), keep_default=False) 19 | 20 | # Adding field 'FormDefinition.public_hash' 21 | db.add_column('form_designer_formdefinition', 'public_hash', self.gf('django.db.models.fields.CharField')(default='', max_length=40), keep_default=False) 22 | 23 | # Changing field 'FormDefinitionField.regex' 24 | db.alter_column('form_designer_formdefinitionfield', 'regex', self.gf('form_designer.fields.RegexpExpressionField')(max_length=255, null=True, blank=True)) 25 | 26 | 27 | def backwards(self, orm): 28 | 29 | # Deleting field 'FormDefinition.require_hash' 30 | db.delete_column('form_designer_formdefinition', 'require_hash') 31 | 32 | # Deleting field 'FormDefinition.private_hash' 33 | db.delete_column('form_designer_formdefinition', 'private_hash') 34 | 35 | # Deleting field 'FormDefinition.public_hash' 36 | db.delete_column('form_designer_formdefinition', 'public_hash') 37 | 38 | # Changing field 'FormDefinitionField.regex' 39 | db.alter_column('form_designer_formdefinitionfield', 'regex', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)) 40 | 41 | 42 | models = { 43 | 'form_designer.formdefinition': { 44 | 'Meta': {'object_name': 'FormDefinition'}, 45 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 46 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 47 | 'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 48 | 'display_logged': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 49 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 50 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 51 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 52 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 53 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 54 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 55 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 56 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 57 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 58 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), 59 | 'private_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 60 | 'public_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 61 | 'require_hash': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 62 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 63 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 64 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 65 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 66 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 67 | }, 68 | 'form_designer.formdefinitionfield': { 69 | 'Meta': {'object_name': 'FormDefinitionField'}, 70 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 71 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 72 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 73 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 74 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 75 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 76 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 77 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 78 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 79 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 80 | 'initial': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 81 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 82 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 83 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 84 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 85 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 86 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 87 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 88 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 89 | 'regex': ('form_designer.fields.RegexpExpressionField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 90 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 91 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 92 | }, 93 | 'form_designer.formlog': { 94 | 'Meta': {'object_name': 'FormLog'}, 95 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 96 | 'data': (DATA_FIELD_TYPE, [], {'null': 'True', 'blank': 'True'}), 97 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 98 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 99 | } 100 | } 101 | 102 | complete_apps = ['form_designer'] 103 | -------------------------------------------------------------------------------- /form_designer/migrations/0006_auto__add_field_formdefinition_save_uploaded_files.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import SchemaMigration 8 | from django.db import models 9 | 10 | class Migration(SchemaMigration): 11 | 12 | def forwards(self, orm): 13 | 14 | # Adding field 'FormDefinition.save_uploaded_files' 15 | db.add_column('form_designer_formdefinition', 'save_uploaded_files', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True), keep_default=False) 16 | 17 | 18 | def backwards(self, orm): 19 | 20 | # Deleting field 'FormDefinition.save_uploaded_files' 21 | db.delete_column('form_designer_formdefinition', 'save_uploaded_files') 22 | 23 | 24 | models = { 25 | 'form_designer.formdefinition': { 26 | 'Meta': {'object_name': 'FormDefinition'}, 27 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 28 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 29 | 'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 30 | 'display_logged': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 31 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 32 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 33 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 34 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 35 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 36 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 37 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 38 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 39 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 40 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), 41 | 'private_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 42 | 'public_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 43 | 'require_hash': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 44 | 'save_uploaded_files': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 45 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 46 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 47 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 48 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 49 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 50 | }, 51 | 'form_designer.formdefinitionfield': { 52 | 'Meta': {'object_name': 'FormDefinitionField'}, 53 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 54 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 55 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 56 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 57 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 58 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 59 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 60 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 61 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 62 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 63 | 'initial': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 64 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 65 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 66 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 67 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 68 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 69 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 70 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 71 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 72 | 'regex': ('form_designer.fields.RegexpExpressionField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 73 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 74 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 75 | }, 76 | 'form_designer.formlog': { 77 | 'Meta': {'object_name': 'FormLog'}, 78 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 79 | 'data': (DATA_FIELD_TYPE, [], {'null': 'True', 'blank': 'True'}), 80 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 81 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 82 | } 83 | } 84 | 85 | complete_apps = ['form_designer'] 86 | -------------------------------------------------------------------------------- /form_designer/migrations/0007_auto__add_field_formdefinition_mail_uploaded_files.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import SchemaMigration 8 | from django.db import models 9 | 10 | class Migration(SchemaMigration): 11 | 12 | def forwards(self, orm): 13 | 14 | # Adding field 'FormDefinition.mail_uploaded_files' 15 | db.add_column('form_designer_formdefinition', 'mail_uploaded_files', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True), keep_default=False) 16 | 17 | 18 | def backwards(self, orm): 19 | 20 | # Deleting field 'FormDefinition.mail_uploaded_files' 21 | db.delete_column('form_designer_formdefinition', 'mail_uploaded_files') 22 | 23 | 24 | models = { 25 | 'form_designer.formdefinition': { 26 | 'Meta': {'object_name': 'FormDefinition'}, 27 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 28 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 29 | 'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 30 | 'display_logged': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 31 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 32 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 33 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 34 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 35 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 36 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 37 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 38 | 'mail_uploaded_files': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 39 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 40 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 41 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), 42 | 'private_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 43 | 'public_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 44 | 'require_hash': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), 45 | 'save_uploaded_files': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 46 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 47 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 48 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 49 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 50 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 51 | }, 52 | 'form_designer.formdefinitionfield': { 53 | 'Meta': {'object_name': 'FormDefinitionField'}, 54 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 55 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 56 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 57 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 58 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 59 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 60 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 61 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 62 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 63 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 64 | 'initial': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 65 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 66 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 67 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 68 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 69 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 70 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 71 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 72 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 73 | 'regex': ('form_designer.fields.RegexpExpressionField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 74 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), 75 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 76 | }, 77 | 'form_designer.formlog': { 78 | 'Meta': {'object_name': 'FormLog'}, 79 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 80 | 'data': (DATA_FIELD_TYPE, [], {'null': 'True', 'blank': 'True'}), 81 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 82 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 83 | } 84 | } 85 | 86 | complete_apps = ['form_designer'] 87 | -------------------------------------------------------------------------------- /form_designer/migrations/0008_auto__add_formvalue__del_field_formlog_data__add_field_formlog_created.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import SchemaMigration 8 | from django.db import models 9 | 10 | try: 11 | from django.contrib.auth import get_user_model 12 | except ImportError: # django < 1.5 13 | from django.contrib.auth.models import User 14 | else: 15 | User = get_user_model() 16 | 17 | class Migration(SchemaMigration): 18 | 19 | def forwards(self, orm): 20 | db.rename_column('form_designer_formlog', 'data', 'tmp_data') 21 | # Adding field 'FormLog.created_by' 22 | db.add_column('form_designer_formlog', 'created_by', self.gf('django.db.models.fields.related.ForeignKey')(to=orm["%s.%s" % (User._meta.app_label, User._meta.object_name)], null=True, blank=True), keep_default=False) 23 | 24 | # Adding model 'FormValue' 25 | db.create_table('form_designer_formvalue', ( 26 | ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), 27 | ('form_log', self.gf('django.db.models.fields.related.ForeignKey')(related_name='values', to=orm['form_designer.FormLog'])), 28 | ('field_name', self.gf('django.db.models.fields.SlugField')(max_length=255, db_index=True)), 29 | ('value', self.gf('django.db.models.fields.TextField')(null=True)), 30 | )) 31 | db.send_create_signal('form_designer', ['FormValue']) 32 | 33 | def backwards(self, orm): 34 | # Adding field 'FormLog.data' 35 | db.add_column('form_designer_formlog', 'data', self.gf(DATA_FIELD_TYPE)(null=True, blank=True), keep_default=False) 36 | 37 | # Deleting field 'FormLog.created_by' 38 | db.delete_column('form_designer_formlog', 'created_by_id') 39 | 40 | # Deleting model 'FormValue' 41 | db.delete_table('form_designer_formvalue') 42 | 43 | models = { 44 | 'auth.group': { 45 | 'Meta': {'object_name': 'Group'}, 46 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 47 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 48 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 49 | }, 50 | 'auth.permission': { 51 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 52 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 53 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 54 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 55 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 56 | }, 57 | "%s.%s" % (User._meta.app_label, User._meta.module_name): { 58 | 'Meta': {'object_name': User.__name__}, 59 | }, 60 | 'contenttypes.contenttype': { 61 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 62 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 63 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 64 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 65 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 66 | }, 67 | 'form_designer.formdefinition': { 68 | 'Meta': {'object_name': 'FormDefinition'}, 69 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 70 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 71 | 'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 72 | 'display_logged': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 73 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 74 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 75 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 76 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 77 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 78 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 79 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 80 | 'mail_uploaded_files': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 81 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 82 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 83 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), 84 | 'private_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 85 | 'public_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 86 | 'require_hash': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 87 | 'save_uploaded_files': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 88 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 89 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 90 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 91 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 92 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 93 | }, 94 | 'form_designer.formdefinitionfield': { 95 | 'Meta': {'ordering': "['position']", 'object_name': 'FormDefinitionField'}, 96 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 97 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 98 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 99 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 100 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 101 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 102 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 103 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 104 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 105 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 106 | 'initial': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 107 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 108 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 109 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 110 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 111 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 112 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 113 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 114 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 115 | 'regex': ('form_designer.fields.RegexpExpressionField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 116 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 117 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 118 | }, 119 | 'form_designer.formlog': { 120 | 'Meta': {'object_name': 'FormLog'}, 121 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 122 | 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "User", 'null': 'True', 'blank': 'True'}), 123 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': "orm['form_designer.FormDefinition']"}), 124 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 125 | }, 126 | 'form_designer.formvalue': { 127 | 'Meta': {'object_name': 'FormValue'}, 128 | 'field_name': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}), 129 | 'form_log': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'values'", 'to': "orm['form_designer.FormLog']"}), 130 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 131 | 'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) 132 | } 133 | } 134 | 135 | complete_apps = ['form_designer'] 136 | -------------------------------------------------------------------------------- /form_designer/migrations/0009_set_data_to_form_log.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from form_designer.settings import VALUE_PICKLEFIELD 3 | DATA_FIELD_TYPE = 'picklefield.fields.PickledObjectField' if VALUE_PICKLEFIELD else 'django.db.models.fields.TextField' 4 | 5 | import datetime 6 | from south.db import db 7 | from south.v2 import DataMigration 8 | from django.db import models 9 | 10 | class Migration(DataMigration): 11 | 12 | def forwards(self, orm): 13 | if VALUE_PICKLEFIELD: 14 | from picklefield.fields import PickledObjectField 15 | tmp_data = PickledObjectField(null=True, blank=True) 16 | else: 17 | tmp_data = models.TextField(null=True, blank=True) 18 | tmp_data.contribute_to_class(orm['form_designer.FormLog'], 'tmp_data') 19 | 20 | for log in orm['form_designer.FormLog'].objects.all(): 21 | log.set_data(log.tmp_data) 22 | log.save() 23 | 24 | # Deleting field 'FormLog.data' 25 | db.delete_column('form_designer_formlog', 'tmp_data') 26 | 27 | def backwards(self, orm): 28 | for log in orm['form_designer.FormLog'].objects.all(): 29 | log.data = log.get_data() 30 | raise Exception(log.data) 31 | log.save() 32 | 33 | models = { 34 | 'auth.group': { 35 | 'Meta': {'object_name': 'Group'}, 36 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 37 | 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), 38 | 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) 39 | }, 40 | 'auth.permission': { 41 | 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, 42 | 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 43 | 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), 44 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 45 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) 46 | }, 47 | 'auth.user': { 48 | 'Meta': {'object_name': 'User'}, 49 | 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 50 | 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), 51 | 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 52 | 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), 53 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 54 | 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 55 | 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 56 | 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 57 | 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), 58 | 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), 59 | 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), 60 | 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), 61 | 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) 62 | }, 63 | 'contenttypes.contenttype': { 64 | 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, 65 | 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 66 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 67 | 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 68 | 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 69 | }, 70 | 'form_designer.formdefinition': { 71 | 'Meta': {'object_name': 'FormDefinition'}, 72 | 'action': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 73 | 'allow_get_initial': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 74 | 'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 75 | 'display_logged': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 76 | 'error_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 77 | 'form_template_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 78 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 79 | 'log_data': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 80 | 'mail_from': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 81 | 'mail_subject': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 82 | 'mail_to': ('form_designer.fields.TemplateCharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 83 | 'mail_uploaded_files': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 84 | 'message_template': ('form_designer.fields.TemplateTextField', [], {'null': 'True', 'blank': 'True'}), 85 | 'method': ('django.db.models.fields.CharField', [], {'default': "'POST'", 'max_length': '10'}), 86 | 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), 87 | 'private_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 88 | 'public_hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40'}), 89 | 'require_hash': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 90 | 'save_uploaded_files': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 91 | 'submit_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 92 | 'success_clear': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 93 | 'success_message': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 94 | 'success_redirect': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 95 | 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) 96 | }, 97 | 'form_designer.formdefinitionfield': { 98 | 'Meta': {'ordering': "['position']", 'object_name': 'FormDefinitionField'}, 99 | 'choice_labels': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 100 | 'choice_model': ('form_designer.fields.ModelNameField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 101 | 'choice_model_empty_label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 102 | 'choice_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 103 | 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 104 | 'field_class': ('django.db.models.fields.CharField', [], {'max_length': '32'}), 105 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['form_designer.FormDefinition']"}), 106 | 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 107 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 108 | 'include_result': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 109 | 'initial': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 110 | 'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 111 | 'max_digits': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 112 | 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 113 | 'max_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 114 | 'min_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 115 | 'min_value': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), 116 | 'name': ('django.db.models.fields.SlugField', [], {'max_length': '255'}), 117 | 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), 118 | 'regex': ('form_designer.fields.RegexpExpressionField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 119 | 'required': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), 120 | 'widget': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}) 121 | }, 122 | 'form_designer.formlog': { 123 | 'Meta': {'object_name': 'FormLog'}, 124 | 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), 125 | 'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), 126 | 'form_definition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'logs'", 'to': "orm['form_designer.FormDefinition']"}), 127 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 128 | }, 129 | 'form_designer.formvalue': { 130 | 'Meta': {'object_name': 'FormValue'}, 131 | 'field_name': ('django.db.models.fields.SlugField', [], {'max_length': '255'}), 132 | 'form_log': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'values'", 'to': "orm['form_designer.FormLog']"}), 133 | 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 134 | 'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) 135 | } 136 | } 137 | 138 | complete_apps = ['form_designer'] 139 | symmetrical = True 140 | -------------------------------------------------------------------------------- /form_designer/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/migrations/__init__.py -------------------------------------------------------------------------------- /form_designer/settings.py: -------------------------------------------------------------------------------- 1 | import os.path 2 | 3 | from django.conf import settings 4 | from django.utils.translation import ugettext_lazy as _ 5 | from django.core.files.storage import get_storage_class 6 | 7 | STATIC_URL = os.path.join(getattr(settings, 'STATIC_URL', settings.MEDIA_URL), 'form_designer') 8 | 9 | FIELD_CLASSES = getattr(settings, 'FORM_DESIGNER_FIELD_CLASSES', ( 10 | ('django.forms.CharField', _('Text')), 11 | ('django.forms.EmailField', _('E-mail address')), 12 | ('django.forms.URLField', _('Web address')), 13 | ('django.forms.IntegerField', _('Number')), 14 | ('django.forms.DecimalField', _('Decimal number')), 15 | ('django.forms.BooleanField', _('Yes/No')), 16 | ('django.forms.DateField', _('Date')), 17 | ('django.forms.DateTimeField', _('Date & time')), 18 | ('django.forms.TimeField', _('Time')), 19 | ('django.forms.ChoiceField', _('Choice')), 20 | ('django.forms.MultipleChoiceField', _('Multiple Choice')), 21 | ('django.forms.ModelChoiceField', _('Model Choice')), 22 | ('django.forms.ModelMultipleChoiceField', _('Model Multiple Choice')), 23 | ('django.forms.RegexField', _('Regex')), 24 | ('django.forms.FileField', _('File')), 25 | # ('captcha.fields.CaptchaField', _('Captcha')), 26 | )) 27 | 28 | WIDGET_CLASSES = getattr(settings, 'FORM_DESIGNER_WIDGET_CLASSES', ( 29 | ('', _('Default')), 30 | ('django.forms.widgets.Textarea', _('Text area')), 31 | ('django.forms.widgets.PasswordInput', _('Password input')), 32 | ('django.forms.widgets.HiddenInput', _('Hidden input')), 33 | ('django.forms.widgets.RadioSelect', _('Radio button')), 34 | )) 35 | 36 | EXPORTER_CLASSES = getattr(settings, 'FORM_DESIGNER_EXPORTER_CLASSES', ( 37 | 'form_designer.contrib.exporters.csv_exporter.CsvExporter', 38 | 'form_designer.contrib.exporters.xls_exporter.XlsExporter', 39 | )) 40 | 41 | FORM_TEMPLATES = getattr(settings, 'FORM_DESIGNER_FORM_TEMPLATES', ( 42 | ('', _('Default')), 43 | ('html/formdefinition/forms/as_p.html', _('as paragraphs')), 44 | ('html/formdefinition/forms/as_table.html', _('as table')), 45 | ('html/formdefinition/forms/as_table_h.html', _('as table (horizontal)')), 46 | ('html/formdefinition/forms/as_ul.html', _('as unordered list')), 47 | ('html/formdefinition/forms/custom.html', _('custom implementation')), 48 | )) 49 | 50 | # Sequence of two-tuples like (('your_app.models.ModelName', 'My Model'), ...) for limiting the models available to ModelChoiceField and ModelMultipleChoiceField. 51 | # If None, any model can be chosen by entering it as a string 52 | CHOICE_MODEL_CHOICES = getattr(settings, 'FORM_DESIGNER_CHOICE_MODEL_CHOICES', None) 53 | 54 | DEFAULT_FORM_TEMPLATE = getattr(settings, 'FORM_DESIGNER_DEFAULT_FORM_TEMPLATE', 'html/formdefinition/forms/as_p.html') 55 | 56 | # semicolon is Microsoft Excel default 57 | CSV_EXPORT_DELIMITER = getattr(settings, 'FORM_DESIGNER_CSV_EXPORT_DELIMITER', ';') 58 | 59 | # include log timestamp in export 60 | CSV_EXPORT_INCLUDE_CREATED = getattr(settings, 'FORM_DESIGNER_CSV_EXPORT_INCLUDE_CREATED', True) 61 | 62 | CSV_EXPORT_INCLUDE_PK = getattr(settings, 'FORM_DESIGNER_CSV_EXPORT_INCLUDE_PK', True) 63 | 64 | # include field labels/names in first row if exporting logs for one form only 65 | CSV_EXPORT_INCLUDE_HEADER = getattr(settings, 'FORM_DESIGNER_CSV_EXPORT_INCLUDE_HEADER', True) 66 | 67 | # include form title if exporting logs for more than one form 68 | CSV_EXPORT_INCLUDE_FORM = getattr(settings, 'FORM_DESIGNER_CSV_EXPORT_INCLUDE_FORM', True) 69 | 70 | CSV_EXPORT_ENCODING = getattr(settings, 'FORM_DESIGNER_CSV_EXPORT_ENCODING', 'utf-8') 71 | 72 | CSV_EXPORT_NULL_VALUE = getattr(settings, 'FORM_DESIGNER_CSV_EXPORT_NULL_VALUE', '') 73 | 74 | SUBMIT_FLAG_NAME = getattr(settings, 'FORM_DESIGNER_SUBMIT_FLAG_NAME', 'submit__%s') 75 | 76 | FILE_STORAGE_CLASS = getattr(settings, 'FORM_DESIGNER_FILE_STORAGE_CLASS', get_storage_class()) 77 | 78 | FILE_STORAGE_DIR = 'form_uploads' 79 | 80 | ALLOWED_FILE_TYPES = getattr(settings, 'FORM_DESIGNER_ALLOWED_FILE_TYPES', ( 81 | 'aac', 'ace', 'ai', 'aiff', 'avi', 'bmp', 'dir', 'doc', 'docx', 'dmg', 'eps', 'fla', 'flv', 82 | 'gif', 'gz', 'hqx', 'ico', 'indd', 'inx', 'jpg', 'jar', 'jpeg', 'md', 'mov', 83 | 'mp3', 'mp4', 'mpc', 'mkv', 'mpg', 'mpeg', 'ogg', 'odg', 'odf', 'odp', 'ods', 'odt', 'otf', 84 | 'pdf', 'png', 'pps', 'ppsx', 'ps', 'psd', 'rar', 'rm', 'rtf', 'sit', 'swf', 'tar', 'tga', 85 | 'tif', 'tiff', 'ttf', 'txt', 'wav', 'wma', 'wmv', 'xls', 'xlsx', 'xml', 'zip' 86 | )) 87 | 88 | MAX_UPLOAD_SIZE = getattr(settings, 'MAX_UPLOAD_SIZE', 5242880) # 5M 89 | MAX_UPLOAD_TOTAL_SIZE = getattr(settings, 'MAX_UPLOAD_TOTAL_SIZE', 10485760) # 10M 90 | 91 | # If true, submitted values won't be stored as strings, but serialized to a PickleField, 92 | # preserving the original type. 93 | VALUE_PICKLEFIELD = getattr(settings, 'FORM_DESIGNER_VALUE_PICKLEFIELD', True) 94 | -------------------------------------------------------------------------------- /form_designer/signals.py: -------------------------------------------------------------------------------- 1 | from django import dispatch 2 | 3 | designedform_submit = dispatch.Signal(providing_args=["designed_form"]) 4 | designedform_success = dispatch.Signal(providing_args=["designed_form"]) 5 | designedform_error = dispatch.Signal(providing_args=["designed_form"]) 6 | designedform_render = dispatch.Signal(providing_args=["designed_form"]) 7 | -------------------------------------------------------------------------------- /form_designer/static/form_designer/js/jquery-inline-collapsible.js: -------------------------------------------------------------------------------- 1 | /* 2 | Makes all inline forms collapsible. 3 | */ 4 | 5 | jQuery(function($) { 6 | $.makeCollapsible = function(target, item, collapsible, triggerTarget, setInitStatus, setFirstStatus) 7 | { 8 | var triggerExpand = gettext('Show'); 9 | var triggerCollapse = gettext('Hide'); 10 | var triggerClass = 'collapse-expand'; 11 | var triggerLink = ''; 12 | var triggerPrepend = ' ('; 13 | var triggerAppend = ')'; 14 | 15 | $(target).find(item).each(function(i) { 16 | if ($(this).data('isCollapsible')) return; 17 | $(this).data('isCollapsible', true); 18 | 19 | $(this).find(collapsible).hide(); 20 | 21 | // trigger already exists if created with "Add another" link 22 | var trigger = $(this).find(triggerTarget).find('.'+triggerClass); 23 | if (!trigger.length) { 24 | trigger = $(triggerLink); 25 | $(this).find(triggerTarget).append(trigger); 26 | trigger.before(triggerPrepend); 27 | trigger.after(triggerAppend); 28 | } 29 | 30 | var item = this; 31 | var toggleCollapse = function(status, speed) 32 | { 33 | if (status == null) { 34 | status = !item.collapseStatus; 35 | } 36 | if (speed == null) { 37 | speed = 1; 38 | } 39 | item.collapseStatus = status; 40 | if (status) { 41 | trigger.html(triggerCollapse); 42 | $(item).find(collapsible).show(); 43 | } else { 44 | trigger.html(triggerExpand); 45 | $(item).find(collapsible).hide(); 46 | } 47 | } 48 | 49 | trigger.click(function(event) { 50 | event.preventDefault(); 51 | toggleCollapse(null, 'normal') 52 | }) 53 | 54 | // Collapse by default unless there are errors 55 | initStatus = setInitStatus != null ? setInitStatus : $(this).find('.errors').length != 0; 56 | firstStatus = setFirstStatus != null ? setFirstStatus : initStatus; 57 | 58 | toggleCollapse(i == 0 ? firstStatus : initStatus) 59 | }); 60 | }; 61 | 62 | var init = function() { 63 | $.makeCollapsible('div.inline-group', 'div.inline-related', 'fieldset', 'h3 b'); 64 | } 65 | init(); 66 | // init again when "Add another" link is clicked 67 | $('.add-row a').click(function() { 68 | init(); 69 | }) 70 | }); 71 | -------------------------------------------------------------------------------- /form_designer/static/form_designer/js/jquery-inline-fieldset-collapsible.js: -------------------------------------------------------------------------------- 1 | /* 2 | Makes all fieldsets inside of inline forms collapsible. 3 | */ 4 | 5 | jQuery(function($) { 6 | var init = function() { 7 | $('div.inline-related').each(function(i) { 8 | $.makeCollapsible(this, 'fieldset', '.form-row', 'h2', null, true) 9 | }); 10 | }; 11 | 12 | init(); 13 | // init again when "Add another" link is clicked 14 | $('.add-row a').click(function() { 15 | init(); 16 | }) 17 | }); 18 | -------------------------------------------------------------------------------- /form_designer/static/form_designer/js/jquery-inline-positioning.js: -------------------------------------------------------------------------------- 1 | /* 2 | Enables repositioning of all inline elements by drag & drop. 3 | 4 | The inline model requires is a "position" field that is blank by default. 5 | This value will be set automatically by this code snippet when dragging elements. 6 | The model instances can then be ordered by that "position" field. 7 | */ 8 | 9 | jQuery(function($) { 10 | 11 | var positionField = $.scriptUrlParam ? $.scriptUrlParam(/jquery-inline-positioning\.js(\?.*)?$/, 'positionField', 'position') : 'position'; 12 | var target = $('div.inline-group#formdefinitionfield_set-group'); 13 | var handle = 'h3 b'; 14 | var item = 'div.inline-related'; 15 | var positionInput = 'input[id$=-'+positionField+']'; 16 | var hidePositionFieldClosest = '.form-row'; 17 | 18 | var renumberAll = function() { 19 | var pos = 1; 20 | target.find(item).each(function(i) { 21 | if ($(this).find(positionInput).val() != '') { 22 | $(this).find(positionInput).val(pos); 23 | pos++; 24 | } 25 | }); 26 | }; 27 | 28 | var init = function() { 29 | target.find(item).each(function(i) { 30 | if ($(this).data('isSortable')) return; 31 | $(this).data('isSortable', true); 32 | 33 | $(this).find(handle).css('cursor', 'move'); 34 | $(this).find(handle).addClass('draggable'); 35 | $(this).find(positionInput).each(function() { 36 | if (hidePositionFieldClosest) { 37 | var hidden =$(''); 38 | hidden.val($(this).val()); 39 | $(this).closest(hidePositionFieldClosest).replaceWith(hidden); 40 | } 41 | }); 42 | $(this).find('input, select, textarea').change(function() { 43 | $(this).closest(item).find('input[id$='+positionField+']').val('X'); // mark for renumberAll() to fill in 44 | renumberAll($('div.inline-group')); 45 | }); 46 | }); 47 | } 48 | 49 | var addRow = target.find('.add-row'); 50 | addRow.remove(); 51 | var ordered = []; 52 | var unordered = []; 53 | // Initially, remove and re-append all inlines ordered by their "position" value 54 | target.find(item).each(function(i) { 55 | var initialPos = $(this).find(positionInput).val(); 56 | if (initialPos) { 57 | while (initialPos < ordered.length && ordered[initialPos]) { 58 | initialPos++; 59 | } 60 | ordered[initialPos] = this; 61 | } else { 62 | unordered[unordered.length] = this; 63 | } 64 | this.parentElement.removeChild(this); 65 | }); 66 | for (var i = 0; i < ordered.length; i++) { 67 | var el = ordered[i]; 68 | if (el) { 69 | target.append(el); 70 | } 71 | } 72 | // Add "position"-less elements in the end 73 | for (var i = 0; i < unordered.length; i++) { 74 | var el = unordered[i]; 75 | target.append(el); 76 | } 77 | target.append(addRow); 78 | 79 | target.sortable({ 80 | containment: 'parent', 81 | /*zindex: 10, */ 82 | items: item, 83 | handle: handle, 84 | update: renumberAll, 85 | opacity: .75 86 | }); 87 | 88 | init(); 89 | // init again when "Add another" link is clicked 90 | $('.add-row a').click(function() { 91 | init(); 92 | }) 93 | 94 | }); 95 | -------------------------------------------------------------------------------- /form_designer/static/form_designer/js/jquery-inline-prepopulate-label.js: -------------------------------------------------------------------------------- 1 | /* 2 | Does exactly what `prepopulated_fields = {"label" : ('name',)}` 3 | would do, but does not URLify the value (since in this case, name is a slug field 4 | but label is a title field). 5 | */ 6 | 7 | jQuery(function($) { 8 | 9 | var target = $('div.inline-group'); 10 | var item = 'div.inline-related'; 11 | var labelSel = 'input[id*=-label]'; 12 | var nameSel = 'input[id*=-name]'; 13 | 14 | var init = function() { 15 | $(target).find(item).each(function(i) { 16 | var item = $(this); 17 | item.find(labelSel).each(function() { 18 | this._changed = item.find(nameSel).val() != $(this).val(); 19 | }); 20 | item.find(labelSel).change(function() { 21 | this._changed = true; 22 | }); 23 | item.find(nameSel).keyup(function() { 24 | labelInput = item.find(labelSel); 25 | if (!labelInput[0]._changed) { 26 | labelInput.val($(this).val()); 27 | } 28 | }); 29 | }); 30 | } 31 | 32 | init(); 33 | // init again when "Add another" link is clicked 34 | $('.add-row a').click(function() { 35 | init(); 36 | }) 37 | }); -------------------------------------------------------------------------------- /form_designer/static/form_designer/js/jquery-inline-rename.js: -------------------------------------------------------------------------------- 1 | /* 2 | Replaces the name in an inline element's header while typing it in the input of the "name" field. 3 | This way, the extra inline element's header will be named instead of numbered #4, #5 etc. 4 | */ 5 | 6 | jQuery(function($) { 7 | 8 | var nameField = $.scriptUrlParam ? $.scriptUrlParam(/jquery-inline-rename\.js(\?.*)?$/, 'nameField', 'name') : 'name'; 9 | var target = $('div.inline-group'); 10 | var item = 'div.inline-related'; 11 | var nameInput = 'input[id*=-'+nameField+']'; 12 | 13 | var init = function() { 14 | target.find(item).each(function() { 15 | var input = $(this).find(nameInput); 16 | var label = $('.inline_label', this); 17 | var rename = function(evenIfEmpty) { 18 | if (evenIfEmpty || input.val()) { 19 | label.text(input.val()); 20 | } 21 | }; 22 | input.keyup(function(event) { 23 | // Update name while typing 24 | rename(true); 25 | }); 26 | rename(false); 27 | }) 28 | } 29 | 30 | init(); 31 | // init again when "Add another" link is clicked 32 | $('.add-row a').click(function() { 33 | init(); 34 | }) 35 | }); 36 | -------------------------------------------------------------------------------- /form_designer/static/form_designer/js/jquery-url-param.js: -------------------------------------------------------------------------------- 1 | jQuery(function($) { 2 | 3 | $.urlParam = function(name, defaultValue, url) { 4 | if (!url) { 5 | url = window.location.href 6 | } 7 | var results = new RegExp('[\\?&]'+name+'=([^&#]*)').exec(url); 8 | return results ? results[1] : defaultValue; 9 | } 10 | 11 | $.scriptUrlParam = function(js, name, defaultValue) { 12 | result = defaultValue; 13 | $('head script[src]').each(function() { 14 | if (this.src.match(js)) { 15 | result = $.urlParam(name, result, this.src); 16 | } 17 | }); 18 | return result; 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /form_designer/templates/admin/form_designer/formlog/change_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/change_list.html" %} 2 | {% load i18n %} 3 | 4 | {% block object-tools %} 5 |
    6 | {% for item in exporters %} 7 |
  • 8 | {{ item.label }} 9 |
  • 10 | {% endfor %} 11 |
12 | {% endblock %} 13 | 14 | -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/base.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | {{ form_definition.title}} 7 | 40 | 41 | 42 | 43 | {% block content %} 44 | {% endblock %} 45 | 46 | 47 | -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/data_message.html: -------------------------------------------------------------------------------- 1 | {% load friendly %}{% for item in data %}{% if item.label %}{{ item.label }}{% else %}{{ item.name }}{% endif %}: {{ item.value|friendly }}
2 | {% endfor %} -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/detail.html: -------------------------------------------------------------------------------- 1 | {% extends "html/formdefinition/base.html" %} 2 | {% block content %} 3 | {% if form_definition.title %}

{{ form_definition.title }}

{% endif %} 4 | {% if form_definition.body %}

{{ form_definition.body|linebreaksbr }}

{% endif %} 5 | {% if messages %} 6 |
    7 | {% for message in messages %} 8 | {{ message }} 9 | {% endfor %} 10 |
11 | {% endif %} 12 | {% include form_template %} 13 | 14 | 15 | 21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/forms/as_p.html: -------------------------------------------------------------------------------- 1 | {% load friendly %} 2 |
3 | {% for entry in logs %} 4 | {% for field in entry.data %} 5 |

6 | 7 | {{ field.value|friendly }} 8 |

9 | {% endfor %} 10 | {% endfor %} 11 | {% for field in form %} 12 | {% if not field.is_hidden %} 13 | {{ field.errors }} 14 |

15 | 16 | {{ field }} 17 |

18 | {% endif %} 19 | {% endfor %} 20 |

21 | {% include "html/formdefinition/forms/includes/submit.html" %} 22 |

23 | {% for field in form.hidden_fields %} 24 | {{ field }} 25 | {% endfor %} 26 | {% csrf_token %} 27 |
28 | -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/forms/as_table.html: -------------------------------------------------------------------------------- 1 | {% load friendly %} 2 |
3 | 4 | 5 | {% for entry in logs %} 6 | {% for field in entry.data %} 7 | 8 | 9 | 10 | 11 | {% endfor %} 12 | {% endfor %} 13 | {% for field in form %} 14 | {% if not field.is_hidden %} 15 | 16 | 19 | 23 | 24 | {% endif %} 25 | {% endfor %} 26 | 27 | 28 | 29 | 30 | 31 |
{{ field.label }}{{ field.value|friendly }}
17 | 18 | 20 | {{ field.errors }} 21 | {{ field }} 22 |
 {% include "html/formdefinition/forms/includes/submit.html" %}
32 | {% for field in form.hidden_fields %} 33 | {{ field }} 34 | {% endfor %} 35 | {% csrf_token %} 36 |
37 | -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/forms/as_table_h.html: -------------------------------------------------------------------------------- 1 | {% load friendly %} 2 |
3 | 4 | 5 | {% for field in form %} 6 | {% if not field.is_hidden %} 7 | 10 | {% endif %} 11 | {% endfor %} 12 | 13 | 14 | {% for entry in logs %} 15 | 16 | {% for field in entry.data %} 17 | 18 | {% endfor %} 19 | 20 | {% endfor %} 21 | 22 | {% for field in form %} 23 | {% if not field.is_hidden %} 24 | 28 | {% endif %} 29 | {% endfor %} 30 | 31 | 32 |
8 | 9 |
{{ field.value|friendly }}
25 | {{ field.errors }} 26 | {{ field }} 27 |
33 |

34 | {% include "html/formdefinition/forms/includes/submit.html" %} 35 |

36 | {% for field in form.hidden_fields %} 37 | {{ field }} 38 | {% endfor %} 39 | {% csrf_token %} 40 |
41 | -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/forms/as_ul.html: -------------------------------------------------------------------------------- 1 | {% load friendly %} 2 |
3 |
    4 | {% for entry in logs %} 5 | {% for field in entry.data %} 6 |
  • 7 | 8 | {{ field.value|friendly }} 9 |
  • 10 | {% endfor %} 11 | {% endfor %} 12 | {% for field in form %} 13 | {% if not field.is_hidden %} 14 |
  • 15 | {{ field.errors }} 16 | 17 | {{ field }} 18 |
  • 19 | {% endif %} 20 | {% endfor %} 21 |
22 |

23 | {% include "html/formdefinition/forms/includes/submit.html" %} 24 |

25 | {% for field in form.hidden_fields %} 26 | {{ field }} 27 | {% endfor %} 28 | {% csrf_token %} 29 |
30 | -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/forms/custom.html: -------------------------------------------------------------------------------- 1 | {% create your own custom.html to override this template %} 2 | {% include "html/formdefinition/forms/as_p.html %} -------------------------------------------------------------------------------- /form_designer/templates/html/formdefinition/forms/includes/submit.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | -------------------------------------------------------------------------------- /form_designer/templates/txt/formdefinition/data_message.txt: -------------------------------------------------------------------------------- 1 | {% load friendly %}{% for item in data %}{% if item.label %}{{ item.label }}{% else %}{{ item.name }}{% endif %}: {{ item.value|friendly|safe }} 2 | 3 | {% endfor %} -------------------------------------------------------------------------------- /form_designer/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samluescher/django-form-designer/d19632be9ae0f931ebe825831f6fe3cb1863dffa/form_designer/templatetags/__init__.py -------------------------------------------------------------------------------- /form_designer/templatetags/friendly.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.db.models.query import QuerySet 3 | from django.utils.translation import ugettext_lazy as _ 4 | from django.template.defaultfilters import yesno 5 | 6 | register = template.Library() 7 | 8 | # Returns a more "human-friendly" representation of value than repr() 9 | def friendly(value, null_value=None): 10 | if value is None and not (null_value is None): 11 | return null_value 12 | if type(value) is QuerySet: 13 | qs = value 14 | value = [] 15 | for object in qs: 16 | value.append(object.__unicode__()) 17 | if type(value) is list: 18 | value = ", ".join(value) 19 | if type(value) is bool: 20 | value = yesno(value, u"%s,%s" % (_('yes'), _('no')),) 21 | if hasattr(value, 'url'): 22 | value = value.url 23 | if not isinstance(value, basestring): 24 | value = unicode(value) 25 | return value 26 | 27 | register.filter(friendly) -------------------------------------------------------------------------------- /form_designer/templatetags/widget_type.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | register = template.Library() 3 | 4 | @register.filter('field_type') 5 | def field_type(obj): 6 | return obj.__class__.__name__ 7 | -------------------------------------------------------------------------------- /form_designer/uploads.py: -------------------------------------------------------------------------------- 1 | from form_designer import settings as app_settings 2 | from django.core.files.base import File 3 | from django.forms.forms import NON_FIELD_ERRORS 4 | from django.utils.translation import ugettext_lazy as _ 5 | from django.db.models.fields.files import FieldFile 6 | from django.template.defaultfilters import filesizeformat 7 | import os 8 | import hashlib, uuid 9 | 10 | 11 | def get_storage(): 12 | return app_settings.FILE_STORAGE_CLASS() 13 | 14 | 15 | def clean_files(form): 16 | total_upload_size = 0 17 | for field in form.file_fields: 18 | uploaded_file = form.cleaned_data.get(field.name, None) 19 | msg = None 20 | if uploaded_file is None: 21 | if field.required: 22 | msg = _('This field is required.') 23 | else: 24 | continue 25 | else: 26 | total_upload_size += uploaded_file._size 27 | if not os.path.splitext(uploaded_file.name)[1].lstrip('.').lower() in \ 28 | app_settings.ALLOWED_FILE_TYPES: 29 | msg = _('This file type is not allowed.') 30 | elif uploaded_file._size > app_settings.MAX_UPLOAD_SIZE: 31 | msg = _('Please keep file size under %(max_size)s. Current size is %(size)s.') % \ 32 | {'max_size': filesizeformat(app_settings.MAX_UPLOAD_SIZE), 33 | 'size': filesizeformat(uploaded_file._size)} 34 | if msg: 35 | form._errors[field.name] = form.error_class([msg]) 36 | 37 | if total_upload_size > app_settings.MAX_UPLOAD_TOTAL_SIZE: 38 | msg = _('Please keep total file size under %(max)s. Current total size is %(current)s.') % \ 39 | {"max": filesizeformat(app_settings.MAX_UPLOAD_TOTAL_SIZE), "current": filesizeformat(total_upload_size)} 40 | 41 | if NON_FIELD_ERRORS in form._errors: 42 | form._errors[NON_FIELD_ERRORS].append(msg) 43 | else: 44 | form._errors[NON_FIELD_ERRORS] = form.error_class([msg]) 45 | 46 | return form.cleaned_data 47 | 48 | 49 | def handle_uploaded_files(form_definition, form): 50 | files = [] 51 | if form_definition.save_uploaded_files and len(form.file_fields): 52 | storage = get_storage() 53 | secret_hash = hashlib.sha1(str(uuid.uuid4())).hexdigest()[:10] 54 | for field in form.file_fields: 55 | uploaded_file = form.cleaned_data.get(field.name, None) 56 | if uploaded_file is None: 57 | continue 58 | valid_file_name = storage.get_valid_name(uploaded_file.name) 59 | root, ext = os.path.splitext(valid_file_name) 60 | filename = storage.get_available_name( 61 | os.path.join(app_settings.FILE_STORAGE_DIR, 62 | form_definition.name, 63 | '%s_%s%s' % (root, secret_hash, ext))) 64 | storage.save(filename, uploaded_file) 65 | form.cleaned_data[field.name] = StoredUploadedFile(filename) 66 | files.append(storage.path(filename)) 67 | return files 68 | 69 | 70 | class StoredUploadedFile(FieldFile): 71 | """ 72 | A wrapper for uploaded files that is compatible to the FieldFile class, i.e. 73 | you can use instances of this class in templates just like you use the value 74 | of FileFields (e.g. `{{ my_file.url }}`) 75 | """ 76 | def __init__(self, name): 77 | File.__init__(self, None, name) 78 | self.field = self 79 | 80 | @property 81 | def storage(self): 82 | return get_storage() 83 | 84 | def save(self, *args, **kwargs): 85 | raise NotImplementedError('Static files are read-only') 86 | 87 | def delete(self, *args, **kwargs): 88 | raise NotImplementedError('Static files are read-only') 89 | 90 | def __unicode__(self): 91 | return self.name 92 | -------------------------------------------------------------------------------- /form_designer/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import patterns, url 2 | 3 | urlpatterns = patterns('', 4 | url(r'^(?P[-\w]+)/$', 'form_designer.views.detail', name='form_designer_detail'), 5 | url(r'^h/(?P[-\w]+)/$', 'form_designer.views.detail_by_hash', name='form_designer_detail_by_hash'), 6 | ) 7 | -------------------------------------------------------------------------------- /form_designer/utils.py: -------------------------------------------------------------------------------- 1 | from django.core.exceptions import ImproperlyConfigured 2 | from django.utils.importlib import import_module 3 | 4 | def get_class(import_path): 5 | try: 6 | dot = import_path.rindex('.') 7 | except ValueError: 8 | raise ImproperlyConfigured("%s isn't a Python path." % import_path) 9 | module, classname = import_path[:dot], import_path[dot + 1:] 10 | try: 11 | mod = import_module(module) 12 | except ImportError, e: 13 | raise ImproperlyConfigured('Error importing module %s: "%s"' % 14 | (module, e)) 15 | try: 16 | return getattr(mod, classname) 17 | except AttributeError: 18 | raise ImproperlyConfigured('Module "%s" does not define a "%s" ' 19 | 'class.' % (module, classname)) 20 | -------------------------------------------------------------------------------- /form_designer/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import get_object_or_404, render_to_response 2 | from django.template import RequestContext 3 | from django.utils.translation import ugettext as _ 4 | from django.http import HttpResponseRedirect 5 | from django.conf import settings 6 | from form_designer import settings as app_settings 7 | from django.contrib import messages 8 | from django.core.context_processors import csrf 9 | 10 | import os 11 | import random 12 | from datetime import datetime 13 | 14 | from form_designer.forms import DesignedForm 15 | from form_designer.models import FormDefinition, FormLog 16 | from form_designer.uploads import handle_uploaded_files 17 | from form_designer.signals import (designedform_submit, designedform_success, 18 | designedform_error, designedform_render) 19 | 20 | 21 | def process_form(request, form_definition, extra_context={}, disable_redirection=False): 22 | context = extra_context 23 | success_message = form_definition.success_message or _('Thank you, the data was submitted successfully.') 24 | error_message = form_definition.error_message or _('The data could not be submitted, please try again.') 25 | form_error = False 26 | form_success = False 27 | is_submit = False 28 | # If the form has been submitted... 29 | if request.method == 'POST' and request.POST.get(form_definition.submit_flag_name): 30 | form = DesignedForm(form_definition, None, request.POST, request.FILES) 31 | is_submit = True 32 | if request.method == 'GET' and request.GET.get(form_definition.submit_flag_name): 33 | form = DesignedForm(form_definition, None, request.GET) 34 | is_submit = True 35 | 36 | if is_submit: 37 | designedform_submit.send(sender=process_form, context=context, 38 | form_definition=form_definition, request=request) 39 | if form.is_valid(): 40 | # Handle file uploads using storage object 41 | files = handle_uploaded_files(form_definition, form) 42 | 43 | # Successful submission 44 | messages.success(request, success_message) 45 | form_success = True 46 | 47 | designedform_success.send(sender=process_form, context=context, 48 | form_definition=form_definition, request=request) 49 | 50 | if form_definition.log_data: 51 | form_definition.log(form, request.user) 52 | if form_definition.mail_to: 53 | form_definition.send_mail(form, files) 54 | if form_definition.success_redirect and not disable_redirection: 55 | return HttpResponseRedirect(form_definition.action or '?') 56 | if form_definition.success_clear: 57 | form = DesignedForm(form_definition) # clear form 58 | else: 59 | form_error = True 60 | designedform_error.send(sender=process_form, context=context, 61 | form_definition=form_definition, request=request) 62 | messages.error(request, error_message) 63 | else: 64 | if form_definition.allow_get_initial: 65 | form = DesignedForm(form_definition, initial_data=request.GET) 66 | else: 67 | form = DesignedForm(form_definition) 68 | designedform_render.send(sender=process_form, context=context, 69 | form_definition=form_definition, request=request) 70 | 71 | context.update({ 72 | 'form_error': form_error, 73 | 'form_success': form_success, 74 | 'form': form, 75 | 'form_definition': form_definition 76 | }) 77 | context.update(csrf(request)) 78 | 79 | if form_definition.display_logged: 80 | logs = form_definition.logs.all().order_by('created') 81 | context.update({'logs': logs}) 82 | 83 | return context 84 | 85 | def _form_detail_view(request, form_definition): 86 | result = process_form(request, form_definition) 87 | if isinstance(result, HttpResponseRedirect): 88 | return result 89 | result.update({ 90 | 'form_template': form_definition.form_template_name or app_settings.DEFAULT_FORM_TEMPLATE 91 | }) 92 | return render_to_response('html/formdefinition/detail.html', result, 93 | context_instance=RequestContext(request)) 94 | 95 | def detail(request, object_name): 96 | form_definition = get_object_or_404(FormDefinition, name=object_name, require_hash=False) 97 | return _form_detail_view(request, form_definition) 98 | 99 | def detail_by_hash(request, public_hash): 100 | form_definition = get_object_or_404(FormDefinition, public_hash=public_hash) 101 | return _form_detail_view(request, form_definition) 102 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Django>=1.5 2 | South>=0.8 3 | django-picklefield>=0.3.1 4 | pytz>=2014.2 5 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # encoding=utf8 2 | import os 3 | from distutils.core import setup 4 | 5 | def read(fname): 6 | return open(os.path.join(os.path.dirname(__file__), fname)).read() 7 | 8 | README = read('README.rst') 9 | 10 | setup( 11 | name = "django-form-designer", 12 | version = "0.8.0", 13 | url = 'http://github.com/philomat/django-form-designer', 14 | license = 'BSD', 15 | description = "Design contact forms, search forms etc from the Django admin, without writing any code. Integrates with Django CMS.", 16 | long_description = README, 17 | 18 | author = 'Samuel Luescher', 19 | author_email = 'sam at luescher dot org', 20 | packages = [ 21 | 'form_designer', 22 | 'form_designer.migrations', 23 | 'form_designer.templatetags', 24 | 'form_designer.contrib', 25 | 'form_designer.contrib.exporters', 26 | 'form_designer.contrib.cms_plugins', 27 | 'form_designer.contrib.cms_plugins.form_designer_form', 28 | ], 29 | package_data = { 30 | 'form_designer': [ 31 | 'static/form_designer/js/*.js', 32 | 'templates/admin/form_designer/formlog/change_list.html', 33 | 'templates/html/formdefinition/*.html', 34 | 'templates/html/formdefinition/forms/*.html', 35 | 'templates/html/formdefinition/forms/includes/*.html', 36 | 'templates/txt/formdefinition/*.txt', 37 | 'locale/*/LC_MESSAGES/*', 38 | ], 39 | }, 40 | classifiers = [ 41 | 'Development Status :: 4 - Beta', 42 | 'Framework :: Django', 43 | 'Intended Audience :: Developers', 44 | 'License :: OSI Approved :: BSD License', 45 | 'Operating System :: OS Independent', 46 | 'Programming Language :: Python', 47 | 'Topic :: Internet :: WWW/HTTP', 48 | ] 49 | ) 50 | --------------------------------------------------------------------------------