File: forms.py

package info (click to toggle)
freedombox 26.2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 82,976 kB
  • sloc: python: 48,504; javascript: 1,736; xml: 481; makefile: 290; sh: 167; php: 32
file content (63 lines) | stat: -rw-r--r-- 2,356 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Django forms for sharing app."""

from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

from plinth.modules.users.components import UsersAndGroups

from . import privileged


class AddShareForm(forms.Form):
    """Form to add a new share."""

    name = forms.RegexField(
        label=_('Name of the share'), strip=True, regex=r'^[a-z0-9]+$',
        help_text=_(
            'A lowercase alpha-numeric string that uniquely identifies a '
            'share. Example: <em>media</em>.'))

    path = forms.CharField(
        label=_('Path to share'), strip=True, help_text=_(
            'Disk path to a folder on this server that you intend to share.'))

    is_public = forms.BooleanField(
        label=_('Public share'), required=False, help_text=_(
            'Make files in this folder available to anyone with the link.'))

    groups = forms.MultipleChoiceField(
        choices=UsersAndGroups.get_group_choices,
        widget=forms.CheckboxSelectMultiple, required=False,
        label=_('User groups that can read the files in the share:'),
        help_text=_(
            'Users of the selected user groups will be able to read the '
            'files in the share.'))

    def __init__(self, *args, **kwargs):
        """Initialize the form with extra request argument."""
        super().__init__(*args, **kwargs)
        self.fields['name'].widget.attrs.update({'autofocus': 'autofocus'})

    def clean_name(self):
        """Check if the name is valid."""
        name = self.cleaned_data['name']
        if 'name' in self.initial and name == self.initial['name']:
            return name

        if any((share for share in privileged.list_shares()
                if name == share['name'])):
            raise ValidationError(_('A share with this name already exists.'))

        return name

    def clean(self):
        """Check that at least one group is added for non-public shares."""
        super().clean()
        is_public = self.cleaned_data.get('is_public')
        groups = self.cleaned_data.get('groups')
        if not is_public and not groups:
            raise forms.ValidationError(
                _('Shares should be either public or shared with at '
                  'least one group'))