Adding Workflow to Sitecore forms (WFFM) - sitecore

I want to add workflow on submitted form, when the user submit a form, content author will review the submitted data then he can approve or reject the submitted data.
Is there any way/workaround to achieve this with WFFM?

A simple approach is to use the Form Reports dialog to archive approved form entries and delete rejected ones. This will give your content authors something similar to a daily queue.
If this does not meet your requirements, another option is to use the Create Item save action to create a Sitecore item from the form data. This save action allows you to control the item's template, placement in the content tree, as well as the field mappings. The template's standard values would contain a Default Workflow of your choosing, which would give authors the ability to approve/reject, etc.

Related

Create an instant validation in an Apex form

I would like to create validations for page items which are fields of a form. I currently have some validations set up for these page items but they trigger only after the form has been submitted. The way I would like the validations to trigger are before the form is submitted so that users get warned of errors with their current field values before submitting the form. I think what I am trying to achieve is called "server side validation".
Thank you in advance
You're looking for 'client side validation'.
There are a few good write-ups on the topic, including a plugin
http://dgielis.blogspot.com/2020/09/building-better-form-in-oracle-apex.html
And a deep dive by one of the APEX devs
https://hardlikesoftware.com/weblog/2017/05/10/apex-client-side-validation/
The main thing to remember is regardless how to supplement the UX with client side validation, server side validation is a required.
Also note, natively defined validations are also performed prior to page submission, where possible.
https://content.dsp.co.uk/apex/client-side-validations

Is there a way to change the blank attribute on Django form fields to False by clicking a button?

I am building a review form that will post to a single model in my database. This form will have multiple sections, each with its own set of questions. I want the user to be able to complete a section and hit a submit button that will save the progress and redirect them to the next section. In essence I want to create an in progress status for the review with the idea that as all sections are finished the user can hit a complete button that will run my validation on the entire form. However, I do not want to allow posting information to the database that has not been cleaned.
I've been thinking through this trying to work out what I need to do and believe the best bet would be to have a complete button on the last page that changes blank to False for the fields of the form. I believe this would allow me to fill out each form and post it to the database as all fields would start as optional but then for that specific model instance the click of the button at the end would institute a change making all fields required, thereby running validators to ensure the form is complete. I believe this will also allow for saving progress and returning to it later if interrupted during completion of the form.
Can anyone provide any insight on if this is even possible? If so does anyone have examples that could guide me?
You can store the unvalidated data to the user's session. The final stage pulls all previous step data out of the session for validation. IIRC the Django form wizard does just this so you don't have to write it.
I might instead do this client-side, using one big (probably Crispy) form, and some client-side pseudo-submit buttons that just invoke Javascript to hide one section of the big form and reveal the next. The final one is a real submit, and redisplay of the whole thing if there are errors.

Django: How to request data and simultaneously have it editable

I have a simple app that gets user input and when a button is clicked, the input is saved as an entry on the database. I'm thinking of creating another app that not only displays the same information (think of view profile) but also simultaneously lets the user edit the text that is displayed in the text field.
I'm guessing the solution is to have the text-fields be auto-filled by pulling the data from the database, and allow overwriting the data once the submit button is clicked.
Typically read and edit views are separated for good reasons like avoiding accidental edits, allowing different levels of access, things like that. But this capability does exist in Django via forms. If you already have a Form built for submitting the data, you can provide a page with existing data pre-filled by initializing the Form instance with the data - in the docs they call this a bound form. See this example in the docs to get an idea of the mechanics.

Django ModelChoiceField, thousands of options , not user friendly

I have a ModelChoiceField in my form:
customer = forms.ModelChoiceField(Customer.objects.all())
the problem is it renders as a drop down with hundreds of options and its difficult for users to find a customer, is there a way to overcome this???
You should use Bootstrap Select - which is a JQuery plugin that allows the searching of dropdown data by setting data-live-search="true" on the desired field.
You can also set data-size="5" which would only show the first 5 options in the immediate dropdown field, other items are accessed via scrolling.
(This will not help if the problem is the time it takes for this dropdown to load).
This is incorrect way to do what you're trying to accomplish here.
If you're displaying more than 20 or so customer then the UI would clutter and it would be hard to find the customer with ChoiceField. You'd probably want to index the data from your DB into a full text search engine such as ElasticSearch which is based on Lucene and then use AJAX to query particular customer by it's name or any unique identifier.
Needless to say here that instead of the ChoiceField, now your form will have a text field and as soon as user tries to fill in the name, the AJAX calls fetches the customers from ElasticSearch and renders the result.

Django: Save user-submitted data from ModelForm for admin review and committing at a later date

I have a form on my Django site (made with ModelForm) where users can submit some data to create new objects or modify existing objects. These data, however, need to be reviewed by our staff before they're committed to the database, sometimes in bulk at a later date.
I know I can use .save(commit=False) in my form-processing view to return an object that has not been saved to the database yet. But is there a way to collect all of these objects from multiple user submissions for later review? Ideally, I'd have an admin page that had a summary list of submissions with "Commit" or "Reject" buttons.
There's no one-step-out-of-the-box way to do this (at least not built in to Django), so you'll need to create the logic yourself, which should be pretty straightforward. Some approaches to consider:
Have a second model/table to which your form saves, then create a view for the review functionality which copies any approved records into the first table.
Avoid having second model/table and add a approved = BoolField(default=False) field to your model/table. Set objects to a custom manager which filters for default=True so the rest of your code will only see approved records by default. Have a second manager that does the opposite, i.e. filtering for unapproved records. Using this second manager, create a view for the review functionality which flips approved to True for anything that gets approved.
If, with the second approach above, you want use Django's admin site to do the review, create a proxy for your model which by default uses the second manager which filters for unapproved records. Then you can use the admin's inline display and editing functionality to see records at a glance and click approve as needed.