Example #1
0
 def test_min_length(self):
     field = SimpleArrayField(forms.CharField(), min_length=4)
     with self.assertRaises(exceptions.ValidationError) as cm:
         field.clean('a,b,c')
     self.assertEqual(
         cm.exception.messages[0],
         'List contains 3 items, it should contain no fewer than 4.')
Example #2
0
 def test_has_changed_empty(self):
     field = SimpleArrayField(forms.CharField())
     self.assertIs(field.has_changed(None, None), False)
     self.assertIs(field.has_changed(None, ''), False)
     self.assertIs(field.has_changed(None, []), False)
     self.assertIs(field.has_changed([], None), False)
     self.assertIs(field.has_changed([], ''), False)
Example #3
0
class SalesLeadsDetailForm(forms.Form):
    # 需求详细
    from product.models import Category
    from .models.leads import TYPE_CHOICES
    start_time = forms.DateTimeField(
        label='开始时间',
        required=False,
        widget=forms.DateTimeInput(attrs={'class': 'datepicker'}))
    due_time = forms.DateTimeField(
        label='截至时间',
        required=False,
        widget=forms.DateTimeInput(attrs={'class': 'datepicker'}))
    type = forms.MultipleChoiceField(label='类型',
                                     choices=TYPE_CHOICES,
                                     required=False)
    thickness = SimpleArrayField(label='厚度',
                                 base_field=forms.DecimalField(
                                     max_digits=4, decimal_places=2),
                                 required=False)
    quantity = forms.IntegerField(label='数量', required=False)
    long_lt = forms.IntegerField(label='长度(最低)', required=False)
    long_gt = forms.IntegerField(label='长度(最高)', required=False)
    height_lt = forms.IntegerField(label='高度(最低)', required=False)
    height_gt = forms.IntegerField(label='高度(最高)', required=False)
    price_lt = forms.IntegerField(label='价格(起)', required=False)
    price_gt = forms.IntegerField(label='价格(止)', required=False)
Example #4
0
 def test_validators_fail(self):
     field = SimpleArrayField(forms.RegexField('[a-e]{2}'))
     with self.assertRaises(exceptions.ValidationError) as cm:
         field.clean('a,bc,de')
     self.assertEqual(
         cm.exception.messages[0],
         'Item 1 in the array did not validate: Enter a valid value.')
Example #5
0
class CustomFieldCSVForm(CSVModelForm):
    content_types = CSVMultipleContentTypeField(
        queryset=ContentType.objects.all(),
        limit_choices_to=FeatureQuery('custom_fields'),
        help_text="One or more assigned object types")
    choices = SimpleArrayField(
        base_field=forms.CharField(),
        required=False,
        help_text='Comma-separated list of field choices')

    class Meta:
        model = CustomField
        fields = (
            'name',
            'label',
            'type',
            'content_types',
            'required',
            'description',
            'weight',
            'filter_logic',
            'default',
            'choices',
            'weight',
        )
Example #6
0
class SymbolForm(FileFormMixin, forms.ModelForm):
    METHODS = (
        (0, "Suggested path"),
        (1, "Upload linux packages"),
        (2, "Upload symbol"),
    )

    method = forms.IntegerField(label="Method",
                                widget=forms.Select(choices=METHODS))
    path = SimpleArrayField(forms.CharField(required=False))
    packages = MultipleUploadedFileField(required=False)
    symbol = UploadedFileField(required=False)

    def __init__(self, *args, **kwargs):
        super(SymbolForm, self).__init__(*args, **kwargs)
        self.fields["banner"].widget.attrs["readonly"] = True

    class Meta:
        model = Dump
        fields = (
            "index",
            "operating_system",
            "banner",
            "method",
            "path",
            "packages",
            "symbol",
        )
        widgets = {
            "index": forms.HiddenInput(),
            "operating_system": forms.HiddenInput(),
        }
Example #7
0
 def test_validate_fail_base_field_error_params(self):
     field = SimpleArrayField(forms.CharField(max_length=2))
     with self.assertRaises(exceptions.ValidationError) as cm:
         field.clean('abc,c,defg')
     errors = cm.exception.error_list
     self.assertEqual(len(errors), 2)
     first_error = errors[0]
     self.assertEqual(
         first_error.message,
         'Item 0 in the array did not validate: Ensure this value has at most 2 characters (it has 3).'
     )
     self.assertEqual(first_error.code, 'item_invalid')
     self.assertEqual(first_error.params, {
         'nth': 0,
         'value': 'abc',
         'limit_value': 2,
         'show_value': 3
     })
     second_error = errors[1]
     self.assertEqual(
         second_error.message,
         'Item 2 in the array did not validate: Ensure this value has at most 2 characters (it has 4).'
     )
     self.assertEqual(second_error.code, 'item_invalid')
     self.assertEqual(second_error.params, {
         'nth': 2,
         'value': 'defg',
         'limit_value': 2,
         'show_value': 4
     })
Example #8
0
class SiteForm(forms.ModelForm):
    url = forms.URLField(max_length=1000,
                         required=True,
                         error_messages=default_url_errors)
    aliases = SimpleArrayField(forms.CharField(),
                               required=False,
                               delimiter='\n',
                               widget=forms.Textarea)

    class Meta:
        model = Site
        exclude = [
            'active_end_date',
            'github_fork',
            'registered_user_count',
            'active_learner_count',
            'course_type',
        ]
        # If the corresponding attribute in site form is uncommented above, these help messages won't show
        help_texts = {
            "language": "Select multiple languages with CMD+Click",
            "geography": "Select multiple geo-zones with CMD+Click",
            #'url': 'This text is not persistent on page, what gives!',
            #'last_checked': 'This text is persistent on the page, conflicts with error help text provided by bootstrap',
        }
        widgets = {
            'active_start_date':
            DateTimeWidget(attrs={'id': 'active_start_date'},
                           bootstrap_version=3),
        }
Example #9
0
class PuzzleDataForm(forms.ModelForm):
    required_constraints = SimpleArrayField(forms.CharField(), required=False)
    screenshot = forms.FileField(required=False)

    def clean_screenshot(self):
        screenshot = self.cleaned_data.get('screenshot')
        if screenshot:
            saved = default_storage.save('screenshots/' + screenshot.name,
                                         screenshot)
            return default_storage.url(saved)

    def clean(self):
        if not self.request.user.is_staff:
            raise ValidationError("Only staff are allowed to save puzzles")

    def save(self, commit=True):
        for attr, value in self.cleaned_data.items():
            print('saving', attr, value)
            if value:
                self.instance.data[attr] = value
        return super().save(commit=commit)

    class Meta:
        model = Puzzle
        fields = ('required_constraints', 'screenshot')
Example #10
0
class HQApiKeyForm(forms.Form):
    name = forms.CharField()
    ip_allowlist = SimpleArrayField(
        forms.GenericIPAddressField(),
        label=ugettext_lazy("Allowed IP Addresses (comma separated)"),
        required=False)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.helper = HQFormHelper()
        self.helper.layout = Layout(
            crispy.Fieldset(
                ugettext_lazy("Add New API Key"),
                crispy.Field('name'),
                crispy.Field('ip_allowlist'),
            ),
            hqcrispy.FormActions(
                StrictButton(mark_safe('<i class="fa fa-plus"></i> {}'.format(
                    ugettext_lazy("Generate New API Key"))),
                             css_class='btn btn-primary',
                             type='submit')))

    def create_key(self, user):
        try:
            HQApiKey.objects.get(name=self.cleaned_data['name'], user=user)
            raise DuplicateApiKeyName
        except HQApiKey.DoesNotExist:
            new_key = HQApiKey.objects.create(
                name=self.cleaned_data['name'],
                ip_allowlist=self.cleaned_data['ip_allowlist'],
                user=user,
            )
            return new_key
Example #11
0
class PostTextForm(PostForm):
    title = forms.CharField(
        label="Заголовок",
        required=True,
        max_length=128,
        widget=forms.TextInput(attrs={"placeholder": "Заголовок 🤙"}),
    )
    text = forms.CharField(
        label="Текст поста",
        required=True,
        max_length=500000,
        widget=forms.Textarea(
            attrs={
                "maxlength": 500000,
                "class": "markdown-editor-full",
                "placeholder": "Дорогой Мартин Алексеевич…"
            }),
    )
    coauthors = SimpleArrayField(
        forms.CharField(max_length=32),
        max_length=10,
        label="Соавторы поста",
        required=False,
    )

    class Meta:
        model = Post
        fields = ["title", "text", "topic", "is_public", "coauthors"]

    def clean(self):
        cleaned_data = super().clean()
        self.validate_coauthors(cleaned_data)
        return cleaned_data
Example #12
0
 def test_validate_fail(self):
     field = SimpleArrayField(forms.CharField(required=True))
     with self.assertRaises(exceptions.ValidationError) as cm:
         field.clean('a,b,')
     self.assertEqual(
         cm.exception.messages[0],
         'Item 2 in the array did not validate: This field is required.')
Example #13
0
 def test_to_python_fail(self):
     field = SimpleArrayField(forms.IntegerField())
     with self.assertRaises(exceptions.ValidationError) as cm:
         field.clean('a,b,9')
     self.assertEqual(
         cm.exception.messages[0],
         'Item 0 in the array did not validate: Enter a whole number.')
Example #14
0
class OptInForm(forms.Form):
    number = forms.CharField(required=True)
    first_name = forms.CharField(required=False)
    last_name = forms.CharField(required=False)
    country = forms.CharField(required=False)
    contact_book = forms.IntegerField()
    user_email = forms.CharField(required=False)
    groups = SimpleArrayField(forms.CharField(strip=True), required=False)
Example #15
0
class RefundSearchForm(forms.Form):
    q = forms.CharField(required=False)
    status = forms.ChoiceField(choices=RefundStatus.choices + [("ALL", "All")],
                               required=False)
    start_date = forms.DateField(required=False)
    end_date = forms.DateField(required=False)
    payment_types = SimpleArrayField(
        forms.ChoiceField(choices=OrderPaymentType.choices), required=False)
Example #16
0
class PostCreateForm(PostForm):
    tags = SimpleArrayField(forms.CharField(
        max_length=13,
        validators=[validate_slug],
    ),
                            delimiter=' ',
                            required=False,
                            help_text='List of tags separated with " "')
Example #17
0
 def test_max_length(self):
     field = SimpleArrayField(forms.CharField(), max_length=2)
     with self.assertRaises(exceptions.ValidationError) as cm:
         field.clean("a,b,c")
     self.assertEqual(
         cm.exception.messages[0],
         "List contains 3 items, it should contain no more than 2.",
     )
Example #18
0
class ProctorForm(forms.ModelForm):
    sem_pointers = SimpleArrayField(forms.IntegerField())

    class Meta:
        model = Student
        exclude = [
            'user',
        ]
Example #19
0
class ExerciseForm(CustomModelForm):
    sets = SimpleArrayField(forms.IntegerField(), required=False)
    rest_duration = forms.IntegerField(initial=60, required=False)
    name = forms.CharField(max_length=250, required=False)
    exercise_type = forms.CharField(max_length=250, required=False)

    class Meta:
        model = Exercise
        fields = ['sets', 'rest_duration', 'name', 'exercise_type']
Example #20
0
class QuestionForm(forms.ModelForm):
    choices = SimpleArrayField(forms.CharField())

    def clean_choices(self):
        return [x for x in self.cleaned_data['choices'][0].splitlines() if x]

    class Meta:
        model = models.ParticipationQuestion
        fields = ('question_text', 'answer_type', 'mandatory')
Example #21
0
class CountryAdminForm(forms.ModelForm):
    italics_terms = SimpleArrayField(forms.CharField(max_length=1024, required=False), delimiter='\n', required=False, widget=forms.Textarea)

    class Meta:
        model = Country
        fields = ('country', 'primary_language', 'italics_terms')

    def clean_italics_terms(self):
        # strip blanks and duplications
        return sorted(list(set(x for x in self.cleaned_data['italics_terms'] if x)))
Example #22
0
class LyricForm(ModelForm):
    lines = SimpleArrayField(CharField(), delimiter='|', widget=Textarea())

    def __init__(self, *args, **kwargs):
        super(LyricForm, self).__init__(*args, **kwargs)

        if self.instance.lines:
            self.instance.lines = '\r\n'.join(self.instance.lines)

        super(LyricForm, self).__init__(*args, **kwargs)
Example #23
0
class GroupAccessControlForm(forms.Form):
    overwrite_existing = forms.BooleanField(
        help_text="Overwrite existing entries", required=False)
    group = forms.ModelChoiceField(queryset=Group.objects.all())
    policy = forms.ChoiceField(choices=AbstractAccessControl.POLICIES)
    services = forms.ModelMultipleChoiceField(
        queryset=Service.objects.all(),
        widget=widgets.FilteredSelectMultiple('Services', False))
    rate = forms.CharField(max_length=100)
    serializers = SimpleArrayField(forms.CharField(), max_length=255)
Example #24
0
class DestructionListForm(forms.ModelForm):
    zaken = forms.CharField()
    reviewer_1 = forms.ModelChoiceField(queryset=User.objects.reviewers().all())
    reviewer_2 = forms.ModelChoiceField(
        queryset=User.objects.reviewers().all(), required=False
    )
    zaken_identificaties = SimpleArrayField(forms.CharField(max_length=250))

    class Meta:
        model = DestructionList
        fields = (
            "name",
            "zaken",
            "reviewer_1",
            "reviewer_2",
            "zaken_identificaties",
            "contains_sensitive_info",
        )

    def clean_zaken(self) -> List[str]:
        return self.cleaned_data["zaken"].split(",")

    def save_items(self, destruction_list):
        zaken = self.cleaned_data["zaken"]
        destruction_list_items = []
        for zaak in zaken:
            destruction_list_items.append(
                DestructionListItem(destruction_list=destruction_list, zaak=zaak)
            )
        DestructionListItem.objects.bulk_create(destruction_list_items)

    def save_assignees(self, destruction_list):
        assignees = []
        for i in range(1, 3):
            reviewer = self.cleaned_data[f"reviewer_{i}"]
            if reviewer:
                assignees.append(
                    DestructionListAssignee(
                        destruction_list=destruction_list, order=i, assignee=reviewer,
                    )
                )
        destruction_list_assignees = DestructionListAssignee.objects.bulk_create(
            assignees
        )
        if destruction_list_assignees:
            destruction_list.assign(destruction_list.next_assignee())
            destruction_list.save()

    def save(self, **kwargs):
        destruction_list = super().save(**kwargs)

        self.save_items(destruction_list)
        self.save_assignees(destruction_list)

        return destruction_list
Example #25
0
class MotorCircuitForm(forms.ModelForm):
    
    volt = SimpleArrayField(CharField(), delimiter='|', widget=Textarea())
    
    #def __init__(self, *args, **kwargs):
        #super().__init__(*args, **kwargs)
        #self.fields['volt'].delimiter = '|'  # Or whichever other character you want.
        

    class Meta:
        model = MotorCircuit
        fields = '__all__'
Example #26
0
class UserGroupForm(forms.ModelForm):
    users = SimpleArrayField(forms.CharField(required=False),
                             delimiter="\n",
                             widget=forms.Textarea(attrs={
                                 "style": "width:80%",
                                 "rows": 10
                             }),
                             help_text=get_help_text(UserGroup, "users"))
    excluded_users = SimpleArrayField(forms.CharField(required=False),
                                      delimiter="\n",
                                      required=False,
                                      widget=forms.Textarea(attrs={
                                          "style": "width:80%",
                                          "rows": 10
                                      }),
                                      help_text=get_help_text(
                                          UserGroup, "excluded_users"))

    class Meta:
        model = UserGroup
        fields = "__all__"
Example #27
0
class GlossaryEntryModelForm(ModelForm):
    examples = SimpleArrayField(
        base_field=CharField(),
        delimiter='|',
        widget=Textarea,
        help_text=
        "When giving more than one example seperate them with a '|' ( Alt Gr + >-Button)."
    )

    class Meta:
        model = GlossaryEntry
        fields = '__all__'
Example #28
0
class DomainsAddForm(forms.Form):
    links = SimpleArrayField(forms.CharField(max_length=100),
                             min_length=1,
                             label=_('Список урлов'),
                             error_messages={
                                 'required': _('Список урлов не задан.'),
                                 'invalid': _('Список урлов некорректен.')
                             })

    def save_urls(self) -> Optional[int]:
        links: list = self.cleaned_data.get('links')

        try:
            timestamp: int = math.floor(timezone.now().timestamp())
            unique_domains = self.collect_unique_domains(links)

            redis_client = redis.Redis(host=settings.REDIS_HOST,
                                       **settings.REDIS_CONFIG)
            curr_id: int = redis_client.incr('curr_id')
            urls = {
                index: domain
                for index, domain in enumerate(unique_domains, start=curr_id)
            }

            # set curr_id for next saving in 'sites' hash table
            redis_client.incr('curr_id', len(urls))

            # save sites in hash table -> pk:domain
            redis_client.hmset('sites', urls)

            # save timestamps in sorted set -> timestamps:sites_pk
            redis_client.zadd('timestamps',
                              {pk: timestamp
                               for pk in urls.keys()},
                              nx=True)

        except Exception:
            print(f'Error: {format_exc()}')
            return None

        return timestamp

    @classmethod
    def collect_unique_domains(cls, urls: list) -> set:
        unique_urls = set()

        for url in urls:
            url: str = get_base_domain(url)

            if url:
                unique_urls.add(url)

        return unique_urls
Example #29
0
class AdminCommuneForm(forms.ModelForm):
    class Meta:
        model = Commune
        exclude = ("pk", )

    code_postaux = SimpleArrayField(
        forms.CharField(),
        widget=widgets.Textarea(),
        delimiter="\n",
        required=False,
        help_text="Un code postal par ligne",
    )
Example #30
0
class AdminActiviteForm(forms.ModelForm):
    class Meta:
        model = Activite
        exclude = ("pk", )

    mots_cles = SimpleArrayField(
        forms.CharField(),
        widget=widgets.Textarea(),
        delimiter="\n",
        required=False,
        help_text="Un mots-clé par ligne",
    )