コード例 #1
0
    def fields(self):
        """Define a list of fields that are used to automatically create forms
        in the update and create views."""

        if self.exclude_fields is None:
            return forms.fields_for_model(self.model)
        else:
            exclude = self.exclude_fields
            return forms.fields_for_model(self.model, exclude=exclude)
コード例 #2
0
ファイル: registration.py プロジェクト: BeOleg/ecobasa
    def __init__(self, *args, **kwargs):
        super(RegistrationCommunityForm, self).__init__(*args, **kwargs)
        fields_user = forms.fields_for_model(EcobasaUserProfile)
        self.fields.update(fields_user)
        self.fields['birth_date'].widget = DateL10nPicker()
        self.fields['avatar'].required = False

        fields_community = forms.fields_for_model(EcobasaCommunityProfile)
        fields_community['contact_location_lat'].widget = forms.HiddenInput()
        fields_community['contact_location_lon'].widget = forms.HiddenInput()
        self.fields.update(fields_community)
コード例 #3
0
ファイル: forms.py プロジェクト: socradev/django-fancypages
    def __init__(self, *args, **kwargs):
        self.parent_pk = kwargs.pop('parent_pk', None)
        super(PageNodeForm, self).__init__(*args, **kwargs)

        PageGroup = get_model('fancypages', 'PageGroup')
        self.fields['groups'].queryset = PageGroup.objects.all()

        # we just need to store these for later to set the key order
        page_field_names = self.fields.keys()

        self.node_field_names = []
        PageNode = get_node_model()
        for field in PageNode._meta.fields:
            if field.editable and \
               field.name not in ['id', 'depth', 'numchild', 'path', 'slug']:
                self.node_field_names.append(field.name)

        additional_fields = forms.fields_for_model(
            PageNode, fields=self.node_field_names)
        self.fields.update(additional_fields)

        # if we have a node instance, initialise the page-related fields
        # with the appropriate values
        instance = kwargs.get('instance')
        if instance:
            for field_name in self.node_field_names:
                self.fields[field_name].initial = getattr(
                    instance.node, field_name)

        # update the field order for the page and node fields
        self.fields.keyOrder = self.node_field_names + page_field_names
コード例 #4
0
ファイル: edit.py プロジェクト: 00WhengWheng/shuup
    def generate_fields(self):
        self.fields["type"] = forms.ChoiceField(choices=[
            ("PersonContact", _("Person")),
            ("CompanyContact", _("Company"))
        ], label=_("Type"))
        self.fields["groups"] = forms.ModelMultipleChoiceField(
            queryset=ContactGroup.objects.all(),
            initial=(self.instance.groups.all() if self.instance.pk else ()),
            required=False,
            widget=forms.CheckboxSelectMultiple(),
            label=_("Contact Groups")
        )
        self.fields_by_model = {}

        classes = (Contact, PersonContact, CompanyContact)
        if self.contact_class:
            classes = (self.contact_class, Contact,)
            self._meta.model = classes[0]

        for model_cls in classes:
            model_name = str(model_cls.__name__)
            model_fields = forms.fields_for_model(
                model_cls, fields=self.FIELDS_BY_MODEL_NAME[model_name], formfield_callback=self.formfield_callback)
            self.fields_by_model[model_name] = model_fields
            self.fields.update(model_fields.items())

        if self.contact_class:
            self.fields.pop("type")  # Can't change that.

        if not self.instance.pk:
            self.fields.pop("is_active")
コード例 #5
0
ファイル: admin.py プロジェクト: parksandwildlife/sdis
 def get_readonly_fields(self, request, obj=None):
     """Lock the document after seeking approval for all but superusers."""
     if obj and request.user.is_superuser:
         return ()
     elif obj and request.user in obj.get_users_with_change_permissions():
         return super(DocumentAdmin, self).get_readonly_fields(request, obj)
     else:
         return fields_for_model(obj, exclude=self.exclude).keys()
コード例 #6
0
ファイル: forms.py プロジェクト: legco-watch/legco-watch
 def from_model(cls, instance, form_kwargs=None):
     # Create a Form from a model instance.  The form has fields for all of the fields in the model that are
     # overridable
     # Get the fields and attach it to the new form instance
     if form_kwargs is None:
         form_kwargs = {}
     fields = [xx.name for xx in instance.get_overridable_fields()]
     fields = fields_for_model(instance._meta.model, fields=fields)
     new_obj = cls(**form_kwargs)
     new_obj.fields = fields
     return new_obj
コード例 #7
0
 def get_model_fields(self):
     """
     Get model fields. Defaults to :obj:`.fields`.
     """
     if self.fields:
         return self.fields
     else:
         fields = list(forms.fields_for_model(self.get_model_class(), fields=self.fields).keys())
         if self.roleid_field and self.roleid_field in fields:
             fields.remove(self.roleid_field)
         return fields
コード例 #8
0
ファイル: forms.py プロジェクト: albanm/djity
 def __init__(self):
     super(SubLocalForm,self).__init__(*args,**kwargs)
     if not hasattr(self.Meta,'exclude'):
         self.Meta.exclude = None
     if not hasattr(self.Meta,'fields'):
         self.Meta.fields = None
      
     self.fields = fields_for_model(
             Form.Meta.model,
             fields=self.Meta.fields,
             exclude=self.Meta.exclude)
        
     print "fields", self.fields
コード例 #9
0
ファイル: registration.py プロジェクト: BeOleg/ecobasa
    def __init__(self, *args, **kwargs):
        super(RegistrationMemberForm, self).__init__(*args, **kwargs)
        fields_user = forms.fields_for_model(EcobasaUserProfile)
        self.fields.update(fields_user)
        self.fields['birth_date'].widget = DateL10nPicker()
        self.fields['avatar'].required = False

        # has_bus is a boolean field, but is represented as a button in the
        # form. Form validation has to be told explicitly that this field is
        # not required.
        self.fields['has_bus'] = forms.CharField(
            widget=forms.HiddenInput(),
            label=self.fields['has_bus'].label,
            required=False)
コード例 #10
0
    def __init__(self, *args, **kwargs):
        super(RegistrationMemberForm, self).__init__(*args, **kwargs)
        fields_user = forms.fields_for_model(EcobasaUserProfile)
        self.fields.update(fields_user)
        self.fields['birth_date'].widget = DateL10nPicker()
        self.fields['avatar'].required = False

        # has_bus is a boolean field, but is represented as a button in the
        # form. Form validation has to be told explicitly that this field is
        # not required.
        self.fields['has_bus'] = forms.CharField(
            widget=forms.HiddenInput(),
            label=self.fields['has_bus'].label,
            required=False)
コード例 #11
0
ファイル: forms.py プロジェクト: dimMoonlight/fropshop
        def __init__(self, user, *args, **kwargs):
            try:
                instance = Profile.objects.get(user=user)
            except Profile.DoesNotExist:
                # User has no profile, try a blank one
                # 用户没有配置文件,尝试一个空白
                instance = Profile(user=user)
            kwargs['instance'] = instance

            super().__init__(*args, **kwargs)

            # Get profile field names to help with ordering later
            # 获取配置文件字段名称以帮助以后进行排序
            profile_field_names = list(self.fields.keys())

            # Get user field names (we look for core user fields first)
            # 获取用户字段名称(我们首先查找核心用户字段)
            core_field_names = set([f.name for f in User._meta.fields])
            user_field_names = ['email']
            for field_name in ('first_name', 'last_name'):
                if field_name in core_field_names:
                    user_field_names.append(field_name)
            user_field_names.extend(User._meta.additional_fields)

            # Store user fields so we know what to save later
            # 存储用户字段,这样我们就知道以后要保存什么
            self.user_field_names = user_field_names

            # Add additional user form fields
            # 添加其他用户窗体字段
            additional_fields = forms.fields_for_model(User,
                                                       fields=user_field_names)
            self.fields.update(additional_fields)

            # Ensure email is required and initialised correctly
            # 确保需要电子邮件并正确初始化
            self.fields['email'].required = True

            # Set initial values
            # 设置初始值
            for field_name in user_field_names:
                self.fields[field_name].initial = getattr(user, field_name)

            # Ensure order of fields is email, user fields then profile fields
            # 确保字段顺序是电子邮件,用户字段然后是配置文件字段
            self.fields.keyOrder = user_field_names + profile_field_names
コード例 #12
0
    def get_fields(self, request, obj=None):
        if self._changeable_fields(request, obj):
            return super(ReadonlyModeMixin, self).get_fields(request, obj)

        if self.fields is not None:
            return self.fields

        fields = None
        if hasattr(self.form, '_meta'):
            fields = getattr(self.form._meta, 'fields', None)

        exclude = self.exclude
        if exclude is None and hasattr(self.form, '_meta'):
            exclude = getattr(self.form._meta, 'exclude', None)

        fields = fields_for_model(self.model, fields, exclude)

        return fields
コード例 #13
0
ファイル: forms.py プロジェクト: luisoibarra/cubasells
    def __init__(self, *args, **kwargs):
        field_dict = forms.fields_for_model(self.model)
        self.fields_name = [x for x in field_dict]
        
        if self.exclude:
            for x in self.fields_name:
                if not x in self.exclude:
                    setattr(self,x,forms.BooleanField(required=False,label=field_dict[x].label,help_text=f'Order by  {field_dict[x].label}'))
                    setattr(self,f'{x}_decrease',forms.BooleanField(required=False,label=f'{field_dict[x].label} decrease',help_text=f'Order by {field_dict[x].label} decreasingly'))
        elif self.fields_to_order:
            for x in self.fields_to_order:
                
                key = [y for y in field_dict if x.startswith(y)]
                if key:
                    key = key[0]
                    label = field_dict[key].label
                    setattr(self,x,forms.BooleanField(required=False,label=label,help_text=f'Order by  {label}'))
                    setattr(self,f'{x}_decrease',forms.BooleanField(required=False,label=f'{label} decrease',help_text=f'Order by {label} decreasingly'))
                else:
                    raise TypeError(f'{x} is not an atribute of {self.model}')
        else:
            for x in self.fields_name:
                setattr(self,x,forms.BooleanField(required=False,label=field_dict[x].label,help_text=f'Order by  {field_dict[x].label}'))
                setattr(self,f'{x}_decrease',forms.BooleanField(required=False,label=f'{field_dict[x].label} decrease',help_text=f'Order by {field_dict[x].label} decreasingly'))
            
        super(forms.Form, self).__init__(*args, **kwargs)
        
        if self.exclude:
            for x in self.fields_name:
                if not x in self.exclude:
                    self.fields[x] = forms.BooleanField(required=False,label=field_dict[x].label,help_text=f'Order by  {field_dict[x].label}')
                    self.fields[f'{x}_decrease'] = forms.BooleanField(required=False,label=f'{field_dict[x].label} decrease',help_text=f'Order by {field_dict[x].label} decreasingly')

        elif self.fields_to_order:
            for x in self.fields_to_order:
                key = [y for y in field_dict if x.startswith(y)][0]
                label = field_dict[key].label
                self.fields[x] = forms.BooleanField(required=False,label=label,help_text=f'Order by  {label}')
                self.fields[f'{x}_decrease'] = forms.BooleanField(required=False,label=f'{label} decrease',help_text=f'Order by {label} decreasingly')

        else:
            for x in self.fields_name:
                self.fields[x] = forms.BooleanField(required=False,label=field_dict[x].label,help_text=f'Order by  {field_dict[x].label}')
                self.fields[f'{x}_decrease'] = forms.BooleanField(required=False,label=f'{field_dict[x].label} decrease',help_text=f'Order by {field_dict[x].label} decreasingly')
コード例 #14
0
class CreateForm(forms.Form):
    module = ModuleChoiceField(
        Module.objects.order_by('title',
                                '-start_date').exclude(is_cancelled=True),
        label='Module',
        help_text='Showing all courses on this programme',
    )
    enrolment_fields = forms.fields_for_model(models.Enrolment)
    status = enrolment_fields['status']

    def __init__(self,
                 *,
                 qa: QualificationAim,
                 missing_student_fields: list,
                 limit_modules=True,
                 **kwargs):
        super().__init__(**kwargs)
        # dynamically filter module options based on the programme
        module_queryset = self.fields['module'].queryset.filter(
            programme=qa.programme)
        # limit modules to recent
        if limit_modules:
            module_queryset = module_queryset.filter(
                start_date__gt=datetime.today() - relativedelta(months=3))
            self.fields['module'].help_text = mark_safe(
                'Showing recent and future courses on this programme. <a href="?all=true">Show all</a>'
            )
        self.fields['module'].queryset = module_queryset

        # dynamically add fields for missing student attributes
        student_fields = forms.fields_for_model(
            model=Student,
            fields=missing_student_fields,
            widgets={'birthdate': DatePickerInput()},  # type: ignore
        )
        self.fields.update(**student_fields)

    def clean(self):
        # Disallow enrolling on full 'weekly classes' (portfolio=32) programs. Other workflows are more forgiving.
        # TODO: replace with portfolio flags
        module = self.cleaned_data.get('module')
        if module and module.portfolio_id == 32 and module.is_full():
            self.add_error('module', 'Module is full')
コード例 #15
0
    def render(self, name, value, attrs=None):
        # Ignore this HTML this returns as we're going to use our own.
        super().render(name, value, attrs)

        # Get the model fields with their widgets
        # TODO: if an option follows a relation we'll need to get the fields/widgest from the related model!
        fields = fields_for_model(self.model)

        # TODO:
        # Only useful if a) not already done on page and with jquery added. So better idea is to supply
        # context items for including jquery, and the datetimepiccker bits and for including this scriplet.
        # i.e. not here.
        script = ""  # '<script>$(function(){$(".DateTimeField").datetimepicker({"format": datetime_format,"step" : 15});});</script>'

        for index, (option, _) in enumerate(self.choices):
            option = self.choices[index][0]
            parts = option.split('__')
            if parts[0] in fields:
                fieldname = parts[0]
                operation = parts[1] if len(parts) > 1 else "exact"

                if operation in operation_text:
                    operation = operation_text[operation]

                if fieldname in fields:
                    classify_widget(fields[fieldname])
                    label = fields[fieldname].label
                    widget = fields[fieldname].widget
                    widget.attrs["id"] = "filter_field{}".format(index)
                    value = self.initial_values.pop(fieldname, 'None')
                else:
                    label = fieldname
                    widget = None
                    value = None

                if widget:
                    self.choices[index] = (option, "{} {} {}".format(
                        label, operation,
                        widget.render(option, value, attrs=attrs)))

        return mark_safe("<div id={}>".format(name) +
                         " and ".join([choice[1] for choice in self.choices]) +
                         "</div>" + script)
コード例 #16
0
        def __init__(self, user, *args, **kwargs):
            try:
                instance = Profile.objects.get(user=user)
            except Profile.DoesNotExist:
                # User has no profile, try a blank one
                instance = Profile(user=user)
            kwargs['instance'] = instance

            super(UserAndProfileForm, self).__init__(*args, **kwargs)

            # Get profile field names to help with ordering later
            profile_field_names = list(self.fields.keys())
            print (profile_field_names)

            # Get user field names (we look for core user fields first)
            core_field_names = set([f.name for f in User._meta.fields])
            print (" core_field_names :,", core_field_names)
            user_field_names = ['email']
            for field_name in ('first_name', 'last_name'):
                if field_name in core_field_names:
                    user_field_names.append(field_name)
            user_field_names.extend(User._meta.additional_fields)

            # Store user fields so we know what to save later
            self.user_field_names = user_field_names

            # Add additional user form fields
            additional_fields = forms.fields_for_model(
                User, fields=user_field_names)
            print (" ~~~~~~",additional_fields)
            self.fields.update(additional_fields)

            # Ensure email is required and initialised correctly
            self.fields['email'].required = True

            # Set initial values
            for field_name in user_field_names:
                #print ("  field_name:  ",field_name )
                self.fields[field_name].initial = getattr(user, field_name)

            # Ensure order of fields is email, user fields then profile fields
            self.fields.keyOrder = user_field_names + profile_field_names
コード例 #17
0
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._related_field_model = {}
        for field, related_fields in self.inline_fields.items():
            model = self._meta.model
            try:  # reverse relation
                related_model = model._meta.fields_map[field].related_model
            except KeyError:  # forward relation
                related_model = getattr(model, field).field.related_model
            self._related_field_model.update({field: related_model})
            related_model_fields = fields_for_model(related_model,
                                                    related_fields)

            for field_name, field_object in related_model_fields.items():
                if self.instance and self.instance.pk:
                    setattr(
                        field_object, 'initial',
                        getattr_chain(self.instance,
                                      '%s.%s' % (field, field_name)))
                self.fields['%s_%s' % (field, field_name)] = field_object
コード例 #18
0
ファイル: forms.py プロジェクト: slinkp/openblock
    def clean(self):
        self._clean_captcha()
        cleaned_data = super(NewsItemForm, self).clean()
        # Reverse-geocode if we need to - eg. user clicked map
        # but didn't give an address.
        if not cleaned_data.get('location_name'):
            if cleaned_data.get('location'):
                from ebpub.geocoder.reverse import reverse_geocode
                from ebpub.geocoder.reverse import ReverseGeocodeError
                try:
                    block, distance = reverse_geocode(cleaned_data['location'])
                    cleaned_data['location_name'] = block.pretty_name
                except ReverseGeocodeError:
                    logger.info(
                        "Saving NewsItem with no location_name because reverse-geocoding %(location)s failed"
                        % cleaned_data)

        # Geocode if we can, and need to.
        # Should not be necessary, but this is groundwork for #284.
        if not cleaned_data.get('location'):
            if cleaned_data.get('location_name'):
                from ebpub.geocoder.base import full_geocode
                try:
                    geocoded = full_geocode(
                        cleaned_data['location_name'].strip(), guess=True)
                    cleaned_data['location'] = geocoded['result'].location.wkt
                except (IndexError, KeyError, AttributeError):
                    logger.info(
                        "Saving NewsItem with no location because geocoding %(location_name)s failed"
                        % cleaned_data)

        # Note, any NewsItem fields that aren't listed in self._meta.fields
        # have to be manually saved here, because that's the list that's
        # normally consulted when setting attributes on the instance.
        # ... And yes, clean() is normally responsible for setting
        # attributes on the bound instance.
        for key in forms.fields_for_model(self._meta.model):
            if key in cleaned_data.keys():
                setattr(self.instance, key, cleaned_data[key])

        return cleaned_data
コード例 #19
0
    def __init__(self, *args, **kwargs):
        self.club = kwargs.pop("club")
        self.request_user = kwargs.pop("request_user")
        self.club_members = kwargs.pop("club_members", None)
        if not self.club_members:
            self.club_members = (self.club.members.filter(
                end_date=None).order_by("-role").all())
        self.request_user_membership = self.club.get_membership_for(
            self.request_user)
        super(ClubMemberForm, self).__init__(*args, **kwargs)

        # Using a ModelForm binds too much the form with the model and we don't want that
        # We want the view to process the model creation since they are multiple users
        # We also want the form to handle bulk deletion
        self.fields.update(
            forms.fields_for_model(
                Membership,
                fields=("role", "start_date", "description"),
                widgets={"start_date": SelectDate},
            ))

        # Role is required only if users is specified
        self.fields["role"].required = False

        # Start date and description are never really required
        self.fields["start_date"].required = False
        self.fields["description"].required = False

        self.fields["users_old"] = forms.ModelMultipleChoiceField(
            User.objects.filter(id__in=[
                ms.user.id for ms in self.club_members if ms.can_be_edited_by(
                    self.request_user, self.request_user_membership)
            ]).all(),
            label=_("Mark as old"),
            required=False,
            widget=forms.CheckboxSelectMultiple,
        )
        if not self.request_user.is_root:
            self.fields.pop("start_date")
コード例 #20
0
ファイル: forms.py プロジェクト: quantm/custom_django_oscar
        def __init__(self, user, *args, **kwargs):
            self.user = user
            try:
                instance = Profile.objects.get(user=user)
            except ObjectDoesNotExist:
                # User has no profile, try a blank one
                instance = Profile(user=user)
            kwargs['instance'] = instance

            super(UserAndProfileForm, self).__init__(*args, **kwargs)

            # Get a list of profile fields to help with ordering later
            profile_field_names = self.fields.keys()
            del profile_field_names[profile_field_names.index('email')]

            self.fields['email'].initial = self.instance.user.email

            # Add user fields (we look for core user fields first)
            core_field_names = set([f.name for f in User._meta.fields])
            user_field_names = ['email']
            for field_name in ('first_name', 'last_name'):
                if field_name in core_field_names:
                    user_field_names.append(field_name)
            user_field_names.extend(User._meta.additional_fields)

            # Store user fields so we know what to save later
            self.user_field_names = user_field_names

            # Add additional user fields
            additional_fields = forms.fields_for_model(
                User, fields=user_field_names)
            self.fields.update(additional_fields)

            # Set initial values
            for field_name in user_field_names:
                self.fields[field_name].initial = getattr(user, field_name)

            # Ensure order of fields is email, user fields then profile fields
            self.fields.keyOrder = user_field_names + profile_field_names
コード例 #21
0
        def __init__(self, user, *args, **kwargs):
            self.user = user
            try:
                instance = Profile.objects.get(user=user)
            except ObjectDoesNotExist:
                # User has no profile, try a blank one
                instance = Profile(user=user)
            kwargs['instance'] = instance

            super(UserAndProfileForm, self).__init__(*args, **kwargs)

            # Get a list of profile fields to help with ordering later
            profile_field_names = self.fields.keys()
            del profile_field_names[profile_field_names.index('email')]

            self.fields['email'].initial = self.instance.user.email

            # Add user fields (we look for core user fields first)
            core_field_names = set([f.name for f in User._meta.fields])
            user_field_names = ['email']
            for field_name in ('first_name', 'last_name'):
                if field_name in core_field_names:
                    user_field_names.append(field_name)
            user_field_names.extend(User._meta.additional_fields)

            # Store user fields so we know what to save later
            self.user_field_names = user_field_names

            # Add additional user fields
            additional_fields = forms.fields_for_model(
                User, fields=user_field_names)
            self.fields.update(additional_fields)

            # Set initial values
            for field_name in user_field_names:
                self.fields[field_name].initial = getattr(user, field_name)

            # Ensure order of fields is email, user fields then profile fields
            self.fields.keyOrder = user_field_names + profile_field_names
コード例 #22
0
ファイル: tagged.py プロジェクト: ecobasa/cosinnus-core
    def __init__(self, *args, **kwargs):
        """
        This mixin requires the form to have a group attribute. Use
        :class:`~cosinnus.forms.group.GroupKwargModelFormMixin` for example::

            class SomeForm(GroupKwargModelFormMixin, TagObjectFormMixin,
                           forms.ModelForm):

                class Meta:
                    model = SomeModel
                    fields = ('field1', 'field2', )
        """

        import warnings
        warnings.warn('cosinnus.forms.tagged.TagObjectFormMixin is deprecated',
                      DeprecationWarning)

        super(TagObjectFormMixin, self).__init__(*args, **kwargs)

        if not hasattr(self, 'group'):
            raise AttributeError("The %s class does not have an attribute "
                                 "'group' defined. Try adding the "
                                 "GroupKwargModelFormMixin before the "
                                 "TagObjectFormMixin" %
                                 self.__class__.__name__)

        media_tag_fields = forms.fields_for_model(TagObject,
                                                  exclude=('group', ))
        self.media_tag_fields_used = []
        for name, field in six.iteritems(media_tag_fields):
            if name not in self.fields:
                self.fields[name] = field
                self.media_tag_fields_used.append(name)

        if self.instance.media_tag:
            data = forms.model_to_dict(self.instance.media_tag,
                                       fields=self.media_tag_fields_used)
            self.initial.update(data)
コード例 #23
0
ファイル: admin.py プロジェクト: parksandwildlife/sdis
    def get_readonly_fields(self, request, obj=None):
        """Custon logic to toggle editing of ProjectPlan fields.

        Logic in sequential order:

        * Superusers and special roles can always edit.
        * If document is not approved yet, and users has change permission,
          then the user can edit all fields except endorsements.
        * Approved SPPs are read-only.
        * All other cases, e.g. users without change permissions,
          default to DocumentAdmin.get_readonly_fields.

        """
        special_user = obj and request.user and (
            request.user.is_superuser or
            request.user in obj.project.special_roles)

        if special_user:
            # Superusers and special roles can always edit SPPs
            # snitch("ProjectPlan admin: editable for special user.")
            return ()

        elif (obj and not obj.is_approved and request.user and
              request.user in obj.get_users_with_change_permissions()):
            # Normal users can edit doc if not approved except endorsements
            # snitch("ProjectPlan admin: non approved = editable except "
                #    "endorsements for team member.")
            return ('bm_endorsement', 'hc_endorsement', 'ae_endorsement')

        # if is_approved: all readonly
        elif (obj and obj.is_approved):
            # snitch("ProjectPlan admin: approved = read-only for normal user.")
            return fields_for_model(obj, exclude=self.exclude).keys()

        else:
            # snitch("ProjectPlan admin: defaulting to DocumentAdmin.")
            return super(ProjectPlanAdmin, self).get_readonly_fields(
                request, obj)
コード例 #24
0
ファイル: forms.py プロジェクト: django-oscar/django-oscar
        def __init__(self, user, *args, **kwargs):
            try:
                instance = Profile.objects.get(user=user)
            except Profile.DoesNotExist:
                # User has no profile, try a blank one
                instance = Profile(user=user)
            kwargs['instance'] = instance

            super().__init__(*args, **kwargs)

            # Get profile field names to help with ordering later
            profile_field_names = list(self.fields.keys())

            # Get user field names (we look for core user fields first)
            core_field_names = set([f.name for f in User._meta.fields])
            user_field_names = ['email']
            for field_name in ('first_name', 'last_name'):
                if field_name in core_field_names:
                    user_field_names.append(field_name)
            user_field_names.extend(User._meta.additional_fields)

            # Store user fields so we know what to save later
            self.user_field_names = user_field_names

            # Add additional user form fields
            additional_fields = forms.fields_for_model(
                User, fields=user_field_names)
            self.fields.update(additional_fields)

            # Ensure email is required and initialised correctly
            self.fields['email'].required = True

            # Set initial values
            for field_name in user_field_names:
                self.fields[field_name].initial = getattr(user, field_name)

            # Ensure order of fields is email, user fields then profile fields
            self.fields.keyOrder = user_field_names + profile_field_names
コード例 #25
0
ファイル: edit.py プロジェクト: dragonsg/shuup-1
    def generate_fields(self):
        self.fields["type"] = forms.ChoiceField(choices=[
            ("PersonContact", _("Person")), ("CompanyContact", _("Company"))
        ],
                                                label=_("Type"))
        self.fields["groups"] = forms.ModelMultipleChoiceField(
            queryset=ContactGroup.objects.all(),
            initial=(self.instance.groups.all() if self.instance.pk else ()),
            required=False,
            widget=forms.CheckboxSelectMultiple(),
            label=_("Contact Groups"))
        self.fields_by_model = {}

        classes = (Contact, PersonContact, CompanyContact)
        if self.contact_class:
            classes = (
                self.contact_class,
                Contact,
            )
            self._meta.model = classes[0]

        for model_cls in classes:
            model_name = str(model_cls.__name__)
            model_fields = forms.fields_for_model(
                model_cls,
                fields=self.FIELDS_BY_MODEL_NAME[model_name],
                formfield_callback=self.formfield_callback)
            self.fields_by_model[model_name] = model_fields
            self.fields.update(model_fields.items())

        if self.contact_class:
            self.fields.pop("type")  # Can't change that.

        if not self.instance.pk:
            self.fields.pop("is_active")

        self.fields["account_manager"].widget = PersonContactChoiceWidget(
            clearable=True)
コード例 #26
0
ファイル: admin.py プロジェクト: ropable/sdis
    def get_readonly_fields(self, request, obj=None):
        """Custom logic to toggle editing of ProjectPlan fields.

        Logic in sequential order:

        * Superusers and special roles can always edit.
        * If document is not approved yet, and users has change permission,
          then the user can edit all fields except endorsements.
        * Approved SPPs are read-only.
        * All other cases, e.g. users without change permissions,
          default to DocumentAdmin.get_readonly_fields.
        """
        special_user = obj and request.user and (request.user.is_superuser
                                                 or request.user
                                                 in obj.project.special_roles)

        if special_user:
            # Superusers and special roles can always edit SPPs
            logger.debug("ProjectPlan admin: editable for special user.")
            return ()

        elif (obj and not obj.is_approved and request.user
              and request.user in obj.get_users_with_change_permissions()):
            # Normal users can edit doc if not approved except endorsements
            logger.debug("ProjectPlan admin: non approved = editable except "
                         "endorsements for team member.")
            return ('bm_endorsement', 'hc_endorsement', 'ae_endorsement')

        # if is_approved: all readonly
        elif (obj and obj.is_approved):
            logger.debug("ProjectPlan admin: approved = read-only "
                         "for normal user.")
            return fields_for_model(obj, exclude=self.exclude).keys()

        else:
            logger.debug("ProjectPlan admin: defaulting to DocumentAdmin.")
            return super(ProjectPlanAdmin,
                         self).get_readonly_fields(request, obj)
コード例 #27
0
ファイル: forms.py プロジェクト: DotNetWebs/openblock
    def clean(self):
        self._clean_captcha()
        cleaned_data = super(NewsItemForm, self).clean()
        # Reverse-geocode if we need to - eg. user clicked map
        # but didn't give an address.
        if not cleaned_data.get('location_name'):
            if cleaned_data.get('location'):
                from ebpub.geocoder.reverse import reverse_geocode
                from ebpub.geocoder.reverse import ReverseGeocodeError
                try:
                    block, distance = reverse_geocode(cleaned_data['location'])
                    cleaned_data['location_name'] = block.pretty_name
                except ReverseGeocodeError:
                    logger.info("Saving NewsItem with no location_name because reverse-geocoding %(location)s failed" % cleaned_data)

        # Geocode if we can, and need to.
        # Should not be necessary, but this is groundwork for #284.
        if not cleaned_data.get('location'):
            if cleaned_data.get('location_name'):
                from ebpub.geocoder.base import full_geocode
                try:
                    geocoded = full_geocode(cleaned_data['location_name'].strip(),
                                            guess=True)
                    cleaned_data['location'] = geocoded['result'].location.wkt
                except (IndexError, KeyError, AttributeError):
                    logger.info("Saving NewsItem with no location because geocoding %(location_name)s failed" % cleaned_data)

        # Note, any NewsItem fields that aren't listed in self._meta.fields
        # have to be manually saved here, because that's the list that's
        # normally consulted when setting attributes on the instance.
        # ... And yes, clean() is normally responsible for setting
        # attributes on the bound instance.
        for key in forms.fields_for_model(self._meta.model):
            if key in cleaned_data.keys():
                setattr(self.instance, key, cleaned_data[key])

        return cleaned_data
コード例 #28
0
ファイル: __init__.py プロジェクト: schyssler/tri.tables
            def __init__(self, *args, **kwargs):
                super(FilterForm, self).__init__(*args, **kwargs)
                for column in filtered_columns_with_ui:
                    name = column.name
                    filter_field = column.get('filter_field')
                    if 'filter_choices' in column and not filter_field:
                        filter_choices = column.filter_choices
                        if isinstance(filter_choices, QuerySet):
                            filter_choices = [(x.pk, x) for x in filter_choices]
                        if ('', '') not in filter_choices:
                            filter_choices = [('', '')] + filter_choices
                        filter_field = forms.ChoiceField(choices=filter_choices)
                    if filter_field:
                        self.fields[name] = filter_field
                    else:
                        model = table.data.model
                        last_name = name.split('__')[-1]
                        for x in name.split('__')[:-1]:
                            try:
                                model = getattr(model, x).get_queryset().model
                            except AttributeError:  # pragma: no cover
                                # Support for old Django versions
                                model = getattr(model, x).get_query_set().model
                        field_by_name = forms.fields_for_model(model)
                        self.fields[name] = field_by_name[last_name]

                for field_name, field in self.fields.items():
                    if isinstance(field, fields.BooleanField):
                        self.fields[field_name] = forms.ChoiceField(label=field.label, help_text=field.help_text, required=False, choices=[('', ''), ('1', 'Yes'), ('0', 'No')])
                        self.fields[field_name].creation_counter = field.creation_counter

                for field in self.fields.values():
                    field.required = False
                    field.blank = True
                    field.null = True
                    if hasattr(field, 'choices') and type(field.choices) in (list, tuple) and field.choices[0] != ('', ''):
                        field.choices = [('', '')] + field.choices
コード例 #29
0
def show_object_ex(record,
                   deep_inspection=False,
                   empty_value=None,
                   simplify_object=True):
    if not record:
        return None
    if isinstance(record, models.Model):
        meta_data = fields_for_model(record)
        data = {}

        for key in meta_data:
            obj = meta_data[key]
            name = obj.label
            field = getattr(record, key)
            if hasattr(field, 'target_field'):
                if deep_inspection:
                    val = [
                        show_object_ex(rec, deep_inspection, empty_value)
                        for rec in field.all()
                    ]
                else:
                    if simplify_object:
                        val = [str(rec) for rec in field.all()]
                    else:
                        val = [rec for rec in field.all()]
            else:
                if hasattr(field, 'get'):
                    val = field.get()
                else:
                    val = field
                if val is None:
                    val = empty_value
            data[name] = val
    else:
        data = record
    return {'record': data}
コード例 #30
0
    def clean(self):
        self._clean_captcha()
        cleaned_data = super(NewsItemForm, self).clean()

        # Reverse-geocode if we need to.
        if not cleaned_data['location_name']:
            if cleaned_data['location']:
                from ebpub.geocoder.reverse import reverse_geocode
                try:
                    block, distance = reverse_geocode(cleaned_data['location'])
                    cleaned_data['location_name'] = block.pretty_name
                except ReverseGeocodeErrror:
                    logger.info("Saving NewsItem with no location_name because reverse-geocoding %(location)s failed" % cleaned_data)

        # Note, any NewsItem fields that aren't listed in self._meta.fields
        # have to be manually saved here, because that's the list that's
        # normally consulted when setting attributes on the instance.
        # ... And yes, clean() is normally responsible for setting
        # attributes on the bound instance.
        for key in forms.fields_for_model(self._meta.model):
            if key in cleaned_data.keys():
                setattr(self.instance, key, cleaned_data[key])

        return cleaned_data
コード例 #31
0
ファイル: forms.py プロジェクト: svenihde/EvaP
class UserForm(forms.ModelForm, BootstrapMixin):
    # steal form field definitions for the User model
    locals().update(
        forms.fields_for_model(User,
                               fields=('first_name', 'last_name', 'email')))

    class Meta:
        model = UserProfile
        fields = ('title', 'first_name', 'last_name', 'email', 'picture',
                  'delegates')

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

        # fix generated form
        self.fields['delegates'].required = False
        self.fields['delegates'].queryset = User.objects.extra(
            select={
                'lower_username': '******'
            }).order_by('lower_username')
        self.fields['delegates'].help_text = ""

        # load user fields
        self.fields['first_name'].initial = self.instance.user.first_name
        self.fields['last_name'].initial = self.instance.user.last_name
        self.fields['email'].initial = self.instance.user.email

    def save(self, *args, **kw):
        # first save the user, so that the profile gets created for sure
        self.instance.user.first_name = self.cleaned_data.get('first_name')
        self.instance.user.last_name = self.cleaned_data.get('last_name')
        self.instance.user.email = self.cleaned_data.get('email')
        self.instance.user.save()
        self.instance = UserProfile.get_for_user(self.instance.user)

        super(UserForm, self).save(*args, **kw)
コード例 #32
0
from django.views.generic.list import ListView
from django.views.generic.edit import UpdateView
from django import forms
from django.forms import fields_for_model, modelformset_factory

from goingout.models import Venue, Ratings

ratings_fields = fields_for_model(Ratings).keys()


class VenueDetailForm(forms.ModelForm):
    ratings = None

    class Meta:
        model = Venue
        fields = '__all__'
        # Assign all ratings widgets as disabled radio select buttons
        widgets = {r: forms.RadioSelect(attrs={'disabled': 'disabled'}) for r in ratings_fields}


class VenueDetail(UpdateView):
    """ This is a effectively a detail class but will use read-only ratings form fields to display """
    model = Venue
    form_class = VenueDetailForm
    template_name = 'goingout/venue_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Create a list of fields for the ratings section, to iterate in the template
        context['ratings'] = [context['form'][r] for r in ratings_fields]
        context['venue_list'] = Venue.objects.all()  # Provide other venues for display on the map
コード例 #33
0
class ConditionAdmin(admin.ModelAdmin):
    list_display = [
        "_instrument", "_data_getter", "condition_group", "_test_results"
    ]
    list_filter = ["date_created", "date_modified"]
    search_fields = [
        "instrument__text",
        "data_getter",
        "condition_group__nickname",
        "condition_group__cases__nickname",
    ]
    date_hierarchy = "date_created"

    readonly_fields = ["_resolver_info", "_test_results"]
    fields = list(fields_for_model(
        models.Condition).keys()) + ["_resolver_info", "_test_results"]

    def get_queryset(self, request):
        queryset = super(ConditionAdmin, self).get_queryset(request)
        self.request = request
        return queryset

    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == "data_getter":
            kwargs["widget"] = Textarea
        return super(ConditionAdmin,
                     self).formfield_for_dbfield(db_field, **kwargs)

    def _instrument(self, instance):
        statuses = self._do_tests(instance)

        def boolean_status(status):
            if isinstance(status, Exception):
                return None
            return status

        app_results = "".join([
            _boolean_icon(boolean_status(status)) for label, status in statuses
            if not label.startswith("django_input_collection.")
        ])
        builtin_results = "".join([
            _boolean_icon(boolean_status(status)) for label, status in statuses
            if label.startswith("django_input_collection.")
        ])
        return format_html(
            '<div style="width: 200px;"><a href="{}">{}</a><hr><div>{}{}</div></div>',
            *[
                instance.pk,
                instance.instrument,
                mark_safe(app_results + (" &bullet; " if app_results else "")),
                mark_safe(builtin_results),
            ],
        )

    _instrument.short_description = """Instrument"""

    def _data_getter(self, instance):
        data_getter = mark_safe("<div>{}</div>".format(instance.data_getter))
        return data_getter + self._resolver_info(instance)

    _data_getter.short_description = """Data Getter"""

    def _resolver_info(self, instance):
        if instance.pk is None:
            return "(Unsaved)"

        resolver, data, error = instance.resolve(raise_exception=False)
        if resolver:
            return format_html(
                "<dt>{}</dt><dd>{}{}</dd>",
                ".".join((resolver.__module__, resolver.__class__.__name__)),
                format_html("<code>{}</code>", repr(data))
                if not error else "",
                format_html(
                    '<code style="color: orange;">Lookup failed!  (Will use collector class default.)<br>{}</code>',
                    error,
                ) if error else "",
            )
        return format_html(
            '<div style="color: red;">{}</div>',
            "NO MATCHING RESOLVER",
        )

    _resolver_info.short_description = """Resolver"""

    def _test_results(self, instance):
        statuses = self._do_tests(instance)

        for i, (label, status) in enumerate(statuses):
            if isinstance(status, Exception):
                # log.error('Exception during %s: %s', label, status)
                status = format_html('<code style="color: red;">{}</code>',
                                     status)
            else:
                status = _boolean_icon(status)
            statuses[i][1] = status
        return mark_safe(
            "<dl>%s</dl>" %
            (format_html_join("", "<dt>{}</dt><dd>{}</dd>", statuses), ))

    _test_results.short_description = """Results"""

    # Internals
    def _do_tests(self, instance):
        if instance.pk is None:
            return []

        from .collection.collectors import registry

        collection_request = instance.instrument.collection_request
        statuses = []
        context = {"user": self.request.user}

        for collector_class in sorted(registry.values(),
                                      key=lambda c:
                                      (c.__module__, c.__name__)):
            try:
                collector = collector_class(
                    collection_request=collection_request, context=context)
                status = collector.is_condition_successful(
                    instance, raise_exception=False)
            except Exception as e:
                log.exception(e)
                status = e
            statuses.append([
                ".".join(
                    (collector_class.__module__, collector_class.__name__)),
                status,
            ])
        return statuses
コード例 #34
0
            self.instance.coordinates = None
            self.instance.coordinates_type = None

        return super().save(commit=True)

    def schedule_tasks(self):
        if self.must_geolocate():
            self.geocoding_task.delay(self.instance.pk)


LocationFormMixin.declared_fields = fields_for_model(
    LocationMixin,
    fields=[
        "location_name",
        "location_address1",
        "location_address2",
        "location_city",
        "location_zip",
        "location_country",
    ],
)


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

        self.fields["contact_email"].required = True
        self.fields["contact_phone"].required = True

コード例 #35
0
ファイル: forms.py プロジェクト: desurus/mathsolutionshelp
 def __init__(self, instance=None, *args, **kwargs):
     _fields = 'attachment'
     _initial = model_to_dict(instance.problem, _fields) if instance is not None else {}
     super(ProblemSubmissionForm, self).__init__(initial=_initial, instance=instance, *args, **kwargs)
     self.fields.update(fields_for_model(ProblemImage, _fields))
コード例 #36
0
# -*- coding=UTF-8 -*-
"""
author:hamioo
date:2018/1/12
describle:
"""
from models import Publisher
from django import forms
TOPIC_CHOICES = (
    ('general', 'General enquiry'),
    ('bug', 'Bug report'),
    ('suggestion', 'Suggestion'),
)
class ContactForm(forms.Form):
    topic = forms.ChoiceField(choices=TOPIC_CHOICES)
    message = forms.CharField(widget=forms.Textarea(),initial="Replacce with your feedback")
    sender = forms.EmailField(required=False)

    def clean_message(self):
        message = self.cleaned_data.get('message','')
        num_words = len(message.split())
        if num_words < 4:
            raise forms.ValidationError("Not enough words")
        return message


PublisherForm = forms.fields_for_model(Publisher)