77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Flow and Stage forms"""
 | 
						|
 | 
						|
from django import forms
 | 
						|
from django.forms import ValidationError
 | 
						|
from django.utils.translation import gettext_lazy as _
 | 
						|
 | 
						|
from passbook.flows.models import Flow, FlowStageBinding, Stage
 | 
						|
from passbook.flows.transfer.importer import FlowImporter
 | 
						|
from passbook.lib.widgets import GroupedModelChoiceField
 | 
						|
 | 
						|
 | 
						|
class FlowForm(forms.ModelForm):
 | 
						|
    """Flow Form"""
 | 
						|
 | 
						|
    class Meta:
 | 
						|
 | 
						|
        model = Flow
 | 
						|
        fields = [
 | 
						|
            "name",
 | 
						|
            "title",
 | 
						|
            "slug",
 | 
						|
            "designation",
 | 
						|
        ]
 | 
						|
        help_texts = {
 | 
						|
            "title": _("Shown as the Title in Flow pages."),
 | 
						|
            "slug": _("Visible in the URL."),
 | 
						|
            "designation": _(
 | 
						|
                (
 | 
						|
                    "Decides what this Flow is used for. For example, the Authentication flow "
 | 
						|
                    "is redirect to when an un-authenticated user visits passbook."
 | 
						|
                )
 | 
						|
            ),
 | 
						|
        }
 | 
						|
        widgets = {
 | 
						|
            "name": forms.TextInput(),
 | 
						|
            "title": forms.TextInput(),
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
class FlowStageBindingForm(forms.ModelForm):
 | 
						|
    """FlowStageBinding Form"""
 | 
						|
 | 
						|
    stage = GroupedModelChoiceField(
 | 
						|
        queryset=Stage.objects.all().select_subclasses(), to_field_name="stage_uuid"
 | 
						|
    )
 | 
						|
 | 
						|
    class Meta:
 | 
						|
 | 
						|
        model = FlowStageBinding
 | 
						|
        fields = [
 | 
						|
            "target",
 | 
						|
            "stage",
 | 
						|
            "re_evaluate_policies",
 | 
						|
            "order",
 | 
						|
        ]
 | 
						|
        labels = {
 | 
						|
            "re_evaluate_policies": _("Re-evaluate Policies"),
 | 
						|
        }
 | 
						|
        widgets = {
 | 
						|
            "name": forms.TextInput(),
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
class FlowImportForm(forms.Form):
 | 
						|
    """Form used for flow importing"""
 | 
						|
 | 
						|
    flow = forms.FileField()
 | 
						|
 | 
						|
    def clean_flow(self):
 | 
						|
        """Check if the flow is valid and rewind the file to the start"""
 | 
						|
        flow = self.cleaned_data["flow"].read()
 | 
						|
        valid = FlowImporter(flow.decode()).validate()
 | 
						|
        if not valid:
 | 
						|
            raise ValidationError(_("Flow invalid."))
 | 
						|
        self.cleaned_data["flow"].seek(0)
 | 
						|
        return self.cleaned_data["flow"]
 |