class CreateStepForm(forms.ModelForm): name = forms.CharField(widget=widgets.TextInput( attrs={'class': 'form-control'})) url = forms.URLField( widget=widgets.TextInput(attrs={'class': 'form-control'}), help_text=('Specify a URL to request outputs from, leave blank if ' 'this step is only going to be used for waiting for ' 'outputs from preceding steps'), required=False) timeout = forms.CharField(widget=widgets.Select( attrs={'class': 'form-control'}, choices=Step.TIMEOUT_CHOICES)) inputs = pg_forms.SimpleArrayField( forms.CharField(), widget=widgets.TextInput(attrs={'class': 'form-control'}), required=False) outputs = pg_forms.SimpleArrayField( forms.CharField(), widget=widgets.TextInput(attrs={'class': 'form-control'}), required=False) headers = HTTPHeaderField( widget=HTTPHeaderWidget(attrs={'class': 'form-control'}), required=False) class Meta: model = Step fields = ( 'name', 'url', 'timeout', 'inputs', 'outputs', 'headers', )
class OrganizationForm(SanitizeFieldsForm, forms.ModelForm): urls = pg_forms.SimpleArrayField( forms.URLField(required=False), required=False, error_messages={'item_invalid': ""}, ) contacts = org_fields.ContactsField(form=ContactsForm, required=False) access = org_fields.PublicPrivateField() class Meta: model = Organization fields = ['name', 'description', 'urls', 'contacts', 'access'] class Media: js = ('js/file-upload.js', 'js/sanitize.js') def __init__(self, *args, **kwargs): self.user = kwargs.pop('user', None) super().__init__(*args, **kwargs) self.fields['name'].error_messages['unique'] = _( "Organization with this name already exists.") def clean_name(self): name = self.cleaned_data['name'] invalid_names = settings.CADASTA_INVALID_ENTITY_NAMES if slugify(name, allow_unicode=True) in invalid_names: raise forms.ValidationError( _("Organization name cannot be “Add” or “New”.")) is_create = not self.instance.id queryset = Organization.objects.filter(name__iexact=name) if is_create: not_unique = queryset.exists() else: not_unique = queryset.exclude(id=self.instance.id).exists() if not_unique: raise forms.ValidationError( self.fields['name'].error_messages['unique']) return name def save(self, *args, **kwargs): instance = super().save(commit=False) is_create = not instance.id instance.save() if is_create: OrganizationRole.objects.create(organization=instance, user=self.user, admin=True) return instance
class OrganizationForm(forms.ModelForm): urls = pg_forms.SimpleArrayField( forms.URLField(required=False), required=False, error_messages={'item_invalid': ""}, ) contacts = ContactsField(form=ContactsForm, required=False) access = PublicPrivateField() class Meta: model = Organization fields = ['name', 'description', 'urls', 'contacts', 'access'] def __init__(self, *args, **kwargs): self.user = kwargs.pop('user', None) super(OrganizationForm, self).__init__(*args, **kwargs) def clean_name(self): name = self.cleaned_data['name'] invalid_names = settings.CADASTA_INVALID_ENTITY_NAMES if slugify(name, allow_unicode=True) in invalid_names: raise forms.ValidationError( _("Organization name cannot be “Add” or “New”.")) return name def save(self, *args, **kwargs): instance = super(OrganizationForm, self).save(commit=False) is_create = not instance.id instance.save() if is_create: OrganizationRole.objects.create( organization=instance, user=self.user, admin=True ) return instance
class ProjectEditDetails(SanitizeFieldsForm, forms.ModelForm): urls = pg_forms.SimpleArrayField( forms.URLField(required=False), required=False, error_messages={'item_invalid': ""}, ) questionnaire = forms.CharField(required=False, widget=S3FileUploadWidget( upload_to='xls-forms', accepted_types=QUESTIONNAIRE_TYPES)) original_file = forms.CharField(required=False, max_length=200, widget=forms.HiddenInput) access = org_fields.PublicPrivateField() contacts = org_fields.ContactsField(form=ContactsForm, required=False) class Media: js = ('js/file-upload.js', 'js/sanitize.js') class Meta: model = Project fields = [ 'name', 'description', 'access', 'urls', 'questionnaire', 'contacts' ] def clean_questionnaire(self): new_form = self.data.get('questionnaire') current_form = self.initial.get('questionnaire') if (new_form is not None and new_form != current_form and self.instance.has_records): raise ValidationError( _("Data has already been contributed to this project. To " "ensure data integrity, uploading a new questionnaire is " "disabled for this project.")) def save(self, *args, **kwargs): new_form = self.data.get('questionnaire') original_file = self.data.get('original_file') current_form = self.initial.get('questionnaire') if new_form: if current_form != new_form: Questionnaire.objects.create_from_form( xls_form=new_form, original_file=original_file, project=self.instance) elif new_form is not None and not self.instance.has_records: self.instance.current_questionnaire = '' return super().save(*args, **kwargs) def clean_name(self): name = self.cleaned_data['name'] # Check that name is not restricted invalid_names = settings.CADASTA_INVALID_ENTITY_NAMES if slugify(name, allow_unicode=True) in invalid_names: raise forms.ValidationError( _("Project name cannot be “Add” or “New”.")) # Check that name is unique org-wide # (Explicit validation because we are using a wizard and the # unique_together validation cannot occur in the proper page) not_unique = Project.objects.filter(name__iexact=name).exclude( id=self.instance.id).exists() if not_unique: raise forms.ValidationError( _("Project with this name already exists")) return name