def add_form_handler_entry(request, form_entry_id, form_handler_plugin_uid, theme=None, template_name=None): """ Add form handler entry. :param django.http.HttpRequest request: :param int form_entry_id: :param int form_handler_plugin_uid: :param fobi.base.BaseTheme theme: Theme instance. :param string template_name: :return django.http.HttpResponse: """ try: form_entry = FormEntry._default_manager.get(pk=form_entry_id) except ObjectDoesNotExist as err: raise Http404(ugettext("Form entry not found.")) user_form_handler_plugin_uids = get_user_form_handler_plugin_uids( request.user) if not form_handler_plugin_uid in user_form_handler_plugin_uids: raise Http404( ugettext("Plugin does not exist or you are not allowed " "to use this plugin!")) FormHandlerPlugin = form_handler_plugin_registry.get( form_handler_plugin_uid) # Check if we deal with form handler plugin that is only allowed to be # used once. In that case, check if it has been used already in the current # form entry. if not FormHandlerPlugin.allow_multiple: times_used = FormHandlerEntry._default_manager \ .filter(form_entry__id=form_entry_id, plugin_uid=FormHandlerPlugin.uid) \ .count() if times_used > 0: raise Http404( ugettext("The {0} plugin can be used only once in a " "form.").format(FormHandlerPlugin.name)) form_handler_plugin = FormHandlerPlugin(user=request.user) form_handler_plugin.request = request FormHandlerPluginForm = form_handler_plugin.get_form() form = None obj = FormHandlerEntry() obj.form_entry = form_entry obj.plugin_uid = form_handler_plugin_uid obj.user = request.user save_object = False if not FormHandlerPluginForm: save_object = True elif 'POST' == request.method: form = form_handler_plugin.get_initialised_create_form_or_404( data=request.POST, files=request.FILES) if form.is_valid(): # Saving the plugin form data. form.save_plugin_data(request=request) # Getting the plugin data. obj.plugin_data = form.get_plugin_data(request=request) save_object = True else: form = form_handler_plugin.get_initialised_create_form_or_404() if save_object: # Save the object. obj.save() messages.info( request, _('The form handler plugin "{0}" was added ' 'successfully.').format(form_handler_plugin.name)) return redirect("{0}?active_tab=tab-form-handlers".format( reverse('fobi.edit_form_entry', kwargs={'form_entry_id': form_entry_id}))) context = { 'form': form, 'form_entry': form_entry, 'form_handler_plugin': form_handler_plugin, } # If given, pass to the template (and override the value set by # the context processor. if theme: context.update({'fobi_theme': theme}) if not template_name: if not theme: theme = get_theme(request=request, as_instance=True) template_name = theme.add_form_handler_entry_template return render_to_response(template_name, context, context_instance=RequestContext(request))
def create_form_with_entries(user=None, create_entries_if_form_exist=True): """ Create test form with entries. Fills the form with pre-defined plugins. :param django.contrib.auth.models.User user: :param bool create_entries_if_form_exist: If set to True, entries are being created even if form already exists (a database record). :return fobi.models.FormEntry: Instance of ``fobi.models.FormEntry`` with a number of form elements and handlers filled in. """ if not user: user = get_or_create_admin_user() try: form_entry = FormEntry._default_manager.get(slug=TEST_FORM_SLUG) if not create_entries_if_form_exist: return None except Exception as e: form_entry = FormEntry( name = TEST_FORM_NAME, slug = TEST_FORM_SLUG, user = user ) form_entry.save() # ************************************************************************* # ******************************** Form elements ************************** # ************************************************************************* position = 1 # Text input form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = TextInputPlugin.uid, plugin_data = '{"name": "username", "required": true, ' '"max_length": "200", "label": "Username"}', position = position ) form_element_entry.save() position += 1 # Email form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = EmailInputPlugin.uid, plugin_data = '{"name": "email", "required": true, "label": "E-mail"}', position = position ) form_element_entry.save() position += 1 # Integer form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = IntegerInputPlugin.uid, plugin_data = '{"name": "age", "required": true, ' '"max_value": "200", "label": "Age"}', position = position ) form_element_entry.save() position += 1 # Boolean select form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = BooleanSelectPlugin.uid, plugin_data = '{"name": "drivers_license", "required": false, ' '"label": "Drivers license?"}', position = position ) form_element_entry.save() position += 1 # Hidden form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = HiddenInputPlugin.uid, plugin_data = '{"name": "special_fields", "required": false, ' '"label": "Special fields"}', position = position ) form_element_entry.save() position += 1 # Content image form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = ContentImagePlugin.uid, plugin_data = '{"fit_method": "center", ' '"file": "fobi_plugins/content_plugin_images/04.jpg", ' '"alt": "Cute girl"}', position = position ) form_element_entry.save() position += 1 # Integer form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = IntegerInputPlugin.uid, plugin_data = '{"name": "number_of_children", "required": false, ' '"label": "Number of children"}', position = position ) form_element_entry.save() position += 1 # Textarea form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = TextareaPlugin.uid, plugin_data = '{"name": "bio", "required": true, "label": "Biography"}', position = position ) form_element_entry.save() position += 1 # Content text form_element_entry = FormElementEntry( form_entry = form_entry, plugin_uid = ContentTextPlugin.uid, plugin_data = '' '{"text": "Suspendisse potenti. Etiam in nunc sodales, congue ' 'lectus ut, suscipit massa. In commodo fringilla orci, in varius ' 'eros gravida a! Aliquam erat volutpat. Donec sodales orci nec ' 'massa aliquam bibendum. Aenean sed condimentum velit. Mauris ' 'luctus bibendum nulla vel tempus. Integer tempor condimentum ' 'ligula sed feugiat. Aenean scelerisque ultricies vulputate. ' 'Donec semper lorem rhoncus sem cras amet."}', position = 9 ) form_element_entry.save() position += 1 # ************************************************************************* # ******************************** Form handlers ************************** # ************************************************************************* # DB save form_handler_entry = FormHandlerEntry( form_entry = form_entry, plugin_uid = DBStoreHandlerPlugin.uid, plugin_data = '' ) form_handler_entry.save() # Mail form_handler_entry = FormHandlerEntry( form_entry = form_entry, plugin_uid = MailHandlerPlugin.uid, plugin_data = '{"from_name": "Fobi administration", ' '"from_email": "*****@*****.**", ' '"to_name": "Artur Barseghyan", ' '"to_email": "*****@*****.**", ' '"subject": "Test mail", "body": "Test body"}' ) form_handler_entry.save() return form_entry
def import_form_entry(request, template_name=None): """ Import form entry. :param django.http.HttpRequest request: :param string template_name: :return django.http.HttpResponse: """ if 'POST' == request.method: form = ImportFormEntryForm(request.POST, request.FILES) if form.is_valid(): # Reading the contents of the file into JSON json_file = form.cleaned_data['file'] file_contents = json_file.read() # This is the form data which we are going to use when recreating # the form. form_data = json.loads(file_contents) # Since we just feed all the data to the `FormEntry` class, # we need to make sure it doesn't have strange fields in. # Furthermore, we will use the `form_element_data` and # `form_handler_data` for filling the missing plugin data. form_elements_data = form_data.pop('form_elements', []) form_handlers_data = form_data.pop('form_handlers', []) # User information we always recreate! form_data['user'] = request.user form_entry = FormEntry(**form_data) form_entry.name += ugettext(" (imported on {0})").format( datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) form_entry.save() # One by one, importing form element plugins. for form_element_data in form_elements_data: if form_element_plugin_registry._registry.get( form_element_data.get('plugin_uid', None), None): form_element = FormElementEntry(**form_element_data) form_element.form_entry = form_entry form_element.save() else: if form_element_data.get('plugin_uid', None): messages.warning( request, _('Plugin {0} is missing in the system.' '').format(form_element_data.get('plugin_uid'))) else: messages.warning( request, _('Some essential plugin data missing in the JSON ' 'import.')) # One by one, importing form handler plugins. for form_handler_data in form_handlers_data: if form_handler_plugin_registry._registry.get( form_handler_data.get('plugin_uid', None), None): form_handler = FormHandlerEntry(**form_handler_data) form_handler.form_entry = form_entry form_handler.save() else: if form_handler.get('plugin_uid', None): messages.warning( request, _('Plugin {0} is missing in the system.' '').format(form_handler.get('plugin_uid'))) else: messages.warning( request, _('Some essential data missing in the JSON ' 'import.')) messages.info(request, _('The form was imported successfully.')) return redirect('fobi.edit_form_entry', form_entry_id=form_entry.pk) else: form = ImportFormEntryForm() # When importing entries from saved JSON we shouldn't just save # them into database and consider it done, since there might be cases # if a certain plugin doesn't exist in the system, which will lead # to broken form entries. Instead, we should check every single # form-element or form-handler plugin for existence. If not doesn't exist # in the system, we might: (1) roll entire transaction back or (2) ignore # broken entries. The `ImportFormEntryForm` form has two fields to # additional fields which serve the purpose: # `ignore_broken_form_element_entries` and # `ignore_broken_form_handler_entries`. When set to True, when a broken # form element/handler plugin has been discovered, the import would # continue, having the broken form element/handler entries not imported. context = { 'form': form, #'form_entry': form_entry } if not template_name: theme = get_theme(request=request, as_instance=True) template_name = theme.import_form_entry_template return render_to_response(template_name, context, context_instance=RequestContext(request))
def add_form_handler_entry(request, form_entry_id, form_handler_plugin_uid, theme=None, template_name=None): """ Add form handler entry. :param django.http.HttpRequest request: :param int form_entry_id: :param int form_handler_plugin_uid: :param string template_name: :return django.http.HttpResponse: """ try: form_entry = FormEntry._default_manager.get(pk=form_entry_id) except ObjectDoesNotExist as err: raise Http404(ugettext("Form entry not found.")) user_form_handler_plugin_uids = get_user_form_handler_plugin_uids( request.user ) if not form_handler_plugin_uid in user_form_handler_plugin_uids: raise Http404(ugettext("Plugin does not exist or you are not allowed " "to use this plugin!")) FormHandlerPlugin = form_handler_plugin_registry.get( form_handler_plugin_uid ) # Check if we deal with form handler plugin that is only allowed to be # used once. In that case, check if it has been used already in the current # form entry. if not FormHandlerPlugin.allow_multiple: times_used = FormHandlerEntry._default_manager \ .filter(form_entry__id=form_entry_id, plugin_uid=FormHandlerPlugin.uid) \ .count() if times_used > 0: raise Http404(ugettext("The {0} plugin can be used only once in a " "form.").format(FormHandlerPlugin.name)) form_handler_plugin = FormHandlerPlugin(user=request.user) form_handler_plugin.request = request FormHandlerPluginForm = form_handler_plugin.get_form() form = None obj = FormHandlerEntry() obj.form_entry = form_entry obj.plugin_uid = form_handler_plugin_uid obj.user = request.user save_object = False if not FormHandlerPluginForm: save_object = True elif 'POST' == request.method: form = form_handler_plugin.get_initialised_create_form_or_404( data = request.POST, files = request.FILES ) if form.is_valid(): # Saving the plugin form data. form.save_plugin_data(request=request) # Getting the plugin data. obj.plugin_data = form.get_plugin_data(request=request) save_object = True else: form = form_handler_plugin.get_initialised_create_form_or_404() if save_object: # Save the object. obj.save() messages.info( request, _('The form handler plugin "{0}" was added successfully.').format( form_handler_plugin.name ) ) return redirect( "{0}?active_tab=tab-form-handlers".format( reverse( 'fobi.edit_form_entry', kwargs = {'form_entry_id': form_entry_id} ) ) ) context = { 'form': form, 'form_entry': form_entry, 'form_handler_plugin': form_handler_plugin, } # If given, pass to the template (and override the value set by # the context processor. if theme: context.update({'fobi_theme': theme}) if not template_name: if not theme: theme = get_theme(request=request, as_instance=True) template_name = theme.add_form_handler_entry_template return render_to_response(template_name, context, context_instance=RequestContext(request))
def import_form_entry(request, template_name=None): """ Import form entry. :param django.http.HttpRequest request: :param string template_name: :return django.http.HttpResponse: """ if 'POST' == request.method: form = ImportFormEntryForm(request.POST, request.FILES) if form.is_valid(): # Reading the contents of the file into JSON file = form.cleaned_data['file'] file_contents = file.read() # This is the form data which we are going to use when recreating # the form. form_data = json.loads(file_contents) # Since we just feed all the data to the `FormEntry` class, # we need to make sure it doesn't have strange fields in. # Furthermore, we will use the `form_element_data` and # `form_handler_data` for filling the missing plugin data. form_elements_data = form_data.pop('form_elements', []) form_handlers_data = form_data.pop('form_handlers', []) # User information we always recreate! form_data['user'] = request.user form_entry = FormEntry(**form_data) form_entry.name += ugettext(" (imported on {0})").format( datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") ) form_entry.save() # One by one, importing form element plugins. for form_element_data in form_elements_data: if form_element_plugin_registry._registry.get( form_element_data.get('plugin_uid', None), None): form_element = FormElementEntry(**form_element_data) form_element.form_entry = form_entry form_element.save() else: if form_element_data.get('plugin_uid', None): messages.warning( request, _('Plugin {0} is missing in the system.').format( form_element_data.get('plugin_uid') ) ) else: messages.warning( request, _('Some essential plugin data missing in the JSON ' 'import.') ) # One by one, importing form handler plugins. for form_handler_data in form_handlers_data: if form_handler_plugin_registry._registry.get( form_handler_data.get('plugin_uid', None), None): form_handler = FormHandlerEntry(**form_handler_data) form_handler.form_entry = form_entry form_handler.save() else: if form_handler.get('plugin_uid', None): messages.warning( request, _('Plugin {0} is missing in the system.').format( form_handler.get('plugin_uid') ) ) else: messages.warning( request, _('Some essential data missing in the JSON ' 'import.') ) messages.info( request, _('The form was imported successfully.') ) return redirect( 'fobi.edit_form_entry', form_entry_id=form_entry.pk ) else: form = ImportFormEntryForm() # When importing entries from saved JSON we shouldn't just save # them into database and consider it done, since there might be cases # if a certain plugin doesn't exist in the system, which will lead # to broken form entries. Instead, we should check every single # form-element or form-handler plugin for existence. If not doesn't exist # in the system, we might: (1) roll entire transaction back or (2) ignore # broken entries. The `ImportFormEntryForm` form has two fields to # additional fields which serve the purpose: # `ignore_broken_form_element_entries` and # `ignore_broken_form_handler_entries`. When set to True, when a broken # form element/handler plugin has been discovered, the import would # continue, having the broken form element/handler entries not imported. context = { 'form': form, #'form_entry': form_entry } if not template_name: theme = get_theme(request=request, as_instance=True) template_name = theme.import_form_entry_template return render_to_response(template_name, context, context_instance=RequestContext(request))
def create_form_with_entries(user=None, create_entries_if_form_exist=True, data={}, is_public=False, name=TEST_FORM_NAME, slug=TEST_FORM_SLUG): """Create test form with entries. Fills the form with pre-defined plugins. :param django.contrib.auth.models.User user: :param bool create_entries_if_form_exist: If set to True, entries are being created even if form already exists (a database record). :param dict data: :param bool is_public: :param str name: :param str slug: :return fobi.models.FormEntry: Instance of ``fobi.models.FormEntry`` with a number of form elements and handlers filled in. """ if not user: user = get_or_create_admin_user() try: form_entry = FormEntry._default_manager.get(slug=slug) if not create_entries_if_form_exist: return None except Exception as err: form_entry = FormEntry( name=name, slug=slug, user=user, is_public=is_public, ) form_entry.save() # ************************************************************************ # ******************************** Form elements ************************* # ************************************************************************ position = 1 for key, entry_data in data.items(): form_element_entry = FormElementEntry(form_entry=form_entry, plugin_uid=entry_data[0], plugin_data=entry_data[1], position=position) form_element_entry.save() position += 1 # ************************************************************************ # ******************************** Form handlers ************************* # ************************************************************************ # DB save form_handler_entry = FormHandlerEntry(form_entry=form_entry, plugin_uid=DBStoreHandlerPlugin.uid, plugin_data='') form_handler_entry.save() # Mail form_handler_entry = FormHandlerEntry( form_entry=form_entry, plugin_uid=MailHandlerPlugin.uid, plugin_data='{' '"from_name": "Fobi administration", ' '"from_email": "*****@*****.**", ' '"to_name": "Artur Barseghyan", ' '"to_email": "*****@*****.**", ' '"subject": "Test mail", "body": "Test body"' '}') form_handler_entry.save() return form_entry
def create_form_with_entries(user=None, create_entries_if_form_exist=True): """Create test form with entries. Fills the form with pre-defined plugins. :param django.contrib.auth.models.User user: :param bool create_entries_if_form_exist: If set to True, entries are being created even if form already exists (a database record). :return fobi.models.FormEntry: Instance of ``fobi.models.FormEntry`` with a number of form elements and handlers filled in. """ if not user: user = get_or_create_admin_user() try: form_entry = FormEntry._default_manager.get(slug=TEST_FORM_SLUG) if not create_entries_if_form_exist: return None except Exception as err: form_entry = FormEntry( name=TEST_FORM_NAME, slug=TEST_FORM_SLUG, user=user ) form_entry.save() # ************************************************************************* # ******************************** Form elements ************************** # ************************************************************************* position = 1 # Text input form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=TextInputPlugin.uid, plugin_data='{"name": "username", "required": true, ' '"max_length": "200", "label": "Username"}', position=position ) form_element_entry.save() position += 1 # Email form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=EmailInputPlugin.uid, plugin_data='{"name": "email", "required": true, "label": "E-mail"}', position=position ) form_element_entry.save() position += 1 # Integer form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=IntegerInputPlugin.uid, plugin_data='{"name": "age", "required": true, ' '"max_value": "200", "label": "Age"}', position=position ) form_element_entry.save() position += 1 # Boolean select form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=BooleanSelectPlugin.uid, plugin_data='{"name": "drivers_license", "required": false, ' '"label": "Drivers license?"}', position=position ) form_element_entry.save() position += 1 # Hidden form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=HiddenInputPlugin.uid, plugin_data='{"name": "special_fields", "required": false, ' '"label": "Special fields"}', position=position ) form_element_entry.save() position += 1 # Content image form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=ContentImagePlugin.uid, plugin_data='{"fit_method": "center", ' '"file": "fobi_plugins/content_plugin_images/04.jpg", ' '"alt": "Cute girl"}', position=position ) form_element_entry.save() position += 1 # Integer form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=IntegerInputPlugin.uid, plugin_data='{"name": "number_of_children", "required": false, ' '"label": "Number of children"}', position=position ) form_element_entry.save() position += 1 # Textarea form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=TextareaPlugin.uid, plugin_data='{"name": "bio", "required": true, "label": "Biography"}', position=position ) form_element_entry.save() position += 1 # Content text form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=ContentTextPlugin.uid, plugin_data='' '{"text": "Suspendisse potenti. Etiam in nunc sodales, ' 'congue lectus ut, suscipit massa. In commodo fringilla ' 'orci, in varius eros gravida a! Aliquam erat volutpat. ' 'Donec sodales orci nec massa aliquam bibendum. Aenean sed ' 'condimentum velit. Mauris luctus bibendum nulla vel ' 'tempus. Integer tempor condimentum ligula sed feugiat. ' 'Aenean scelerisque ultricies vulputate. Donec semper ' 'lorem rhoncus sem cras amet."}', position=9 ) form_element_entry.save() position += 1 # ************************************************************************* # ******************************** Form handlers ************************** # ************************************************************************* # DB save form_handler_entry = FormHandlerEntry( form_entry=form_entry, plugin_uid=DBStoreHandlerPlugin.uid, plugin_data='' ) form_handler_entry.save() # Mail form_handler_entry = FormHandlerEntry( form_entry=form_entry, plugin_uid=MailHandlerPlugin.uid, plugin_data='{"from_name": "Fobi administration", ' '"from_email": "*****@*****.**", ' '"to_name": "Artur Barseghyan", ' '"to_email": "*****@*****.**", ' '"subject": "Test mail", "body": "Test body"}' ) form_handler_entry.save() return form_entry
def create_form_with_entries(user=None, create_entries_if_form_exist=True, data={}, is_public=False, name=TEST_FORM_NAME, slug=TEST_FORM_SLUG): """Create test form with entries. Fills the form with pre-defined plugins. :param django.contrib.auth.models.User user: :param bool create_entries_if_form_exist: If set to True, entries are being created even if form already exists (a database record). :param dict data: :param bool is_public: :param str name: :param str slug: :return fobi.models.FormEntry: Instance of ``fobi.models.FormEntry`` with a number of form elements and handlers filled in. """ if not user: user = get_or_create_admin_user() try: form_entry = FormEntry._default_manager.get(slug=slug) if not create_entries_if_form_exist: return None except Exception as err: form_entry = FormEntry( name=name, slug=slug, user=user, is_public=is_public, ) form_entry.save() # ************************************************************************ # ******************************** Form elements ************************* # ************************************************************************ position = 1 for key, entry_data in data.items(): form_element_entry = FormElementEntry( form_entry=form_entry, plugin_uid=entry_data[0], plugin_data=entry_data[1], position=position ) form_element_entry.save() position += 1 # ************************************************************************ # ******************************** Form handlers ************************* # ************************************************************************ # DB save form_handler_entry = FormHandlerEntry( form_entry=form_entry, plugin_uid=DBStoreHandlerPlugin.uid, plugin_data='' ) form_handler_entry.save() # Mail form_handler_entry = FormHandlerEntry( form_entry=form_entry, plugin_uid=MailHandlerPlugin.uid, plugin_data='{' '"from_name": "Fobi administration", ' '"from_email": "*****@*****.**", ' '"to_name": "Artur Barseghyan", ' '"to_email": "*****@*****.**", ' '"subject": "Test mail", "body": "Test body"' '}' ) form_handler_entry.save() return form_entry