Example #1
0
class StudentSignUpForm(CustomUserCreationForm):
    university = autocomplete.Select2ListCreateChoiceField(
        choice_list=uni_list(),
        required=False,
        widget=autocomplete.ListSelect2(url='accounts:uni-autocomplete')  #,
        #initial = self.user.university
    )
    major = autocomplete.Select2ListCreateChoiceField(
        choice_list=major_list,
        required=False,
        widget=autocomplete.ListSelect2(url='accounts:major-autocomplete')  #,
        # initial = self.user.major
    )
    grad_date = forms.DateField(widget=MonthYearWidget)

    class Meta(CustomUserCreationForm.Meta):
        model = CustomUser

    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_student = True
        user.save()
        student = Student.objects.create(
            user=user,
            major=self.cleaned_data['major'],
            university=self.cleaned_data['university'],
            grad_date=self.cleaned_data['grad_date'])
        return user
Example #2
0
class StudentProfileForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = [
            'email', 'first_name', 'last_name', 'university', 'major',
            'grad_date', 'career_interest'
        ]

    first_name = forms.CharField(
        label='your first name')  #, default = self.user.first_name)
    last_name = forms.CharField(
        label='your last name')  #, default = self.user.last_name)
    university = autocomplete.Select2ListCreateChoiceField(
        choice_list=uni_list(),
        required=False,
        widget=autocomplete.ListSelect2(url='accounts:uni-autocomplete')  #,
        #initial = self.user.university
    )
    major = autocomplete.Select2ListCreateChoiceField(
        choice_list=major_list(),
        required=False,
        widget=autocomplete.ListSelect2(url='accounts:major-autocomplete')  #,
        # initial = self.user.major
    )
    grad_date = forms.DateField(
        widget=MonthYearWidget)  #, default = self.user.grad_date)
    career_interest = autocomplete.Select2ListCreateChoiceField(
        choice_list=career_list(),
        required=False,
        widget=autocomplete.ListSelect2(url='accounts:career-autocomplete'))
Example #3
0
 def __init__(self, *args, **kwargs):
     attrs = {
         'data-placeholder': 'Type to get suggestions',
         'data-minimum-input-length': 3,
         'data-html': True,
     }
     super(NetworkVizFilterForm, self).__init__(*args, **kwargs)
     self.fields['select_relation'] = forms.ChoiceField(
         label='Relation type',
         choices=list(
             ('-'.join(x.name.split()), x.name)
             for x in ContentType.objects.filter(app_label='relations')),
         help_text=
         "Include only relations related to this annotation project \
         (See the include general relations checkbox)")
     self.fields['select_relation'].initial = ('person-place',
                                               'person place')
     self.fields[
         'search_source'] = autocomplete.Select2ListCreateChoiceField(
             label='Search source',
             widget=autocomplete.ListSelect2(url=reverse(
                 'entities:generic_network_entities_autocomplete',
                 kwargs={'entity': 'person'}),
                                             attrs=attrs))
     self.fields[
         'search_target'] = autocomplete.Select2ListCreateChoiceField(
             label='Search target',
             widget=autocomplete.ListSelect2(url=reverse(
                 'entities:generic_network_entities_autocomplete',
                 kwargs={'entity': 'place'}),
                                             attrs=attrs))
     self.fields['select_kind'] = autocomplete.Select2ListCreateChoiceField(
         label='Select kind',
         widget=autocomplete.ListSelect2(url=reverse(
             'vocabularies:generic_vocabularies_autocomplete',
             kwargs={
                 'vocab': 'personplacerelation',
                 'direct': 'normal'
             }),
                                         attrs=attrs))
     # self.fields['annotation_proj'] = forms.ChoiceField(
     #     label='Annotation Project',
     #     choices=BLANK_CHOICE_DASH + list((x.pk, x.name) for x in AnnotationProject.objects.all()),
     #     required=False,
     #     help_text="Include only relations related to this annotation project \
     #     (See the include general relations checkbox)")
     self.helper = FormHelper()
     self.helper.form_class = 'FilterNodesForm'
     self.helper.form_action = 'NetJson-list'
     self.helper.add_input(Submit('Submit', 'Add nodes'))
     self.order_fields(
         ('select_relation', 'ann_include_all', 'annotation_proj',
          'search_source', 'select_kind', 'search_target'))
Example #4
0
 def __init__(self, entity, *args, **kwargs):
     attrs = {
         'data-placeholder': 'Type to get suggestions',
         'data-minimum-input-length': 3,
         'data-html': True,
         'style': 'width: auto'
     }
     ent_merge_pk = kwargs.pop('ent_merge_pk', False)
     super(GenericEntitiesStanbolForm, self).__init__(*args, **kwargs)
     self.entity = entity
     self.helper = FormHelper()
     form_kwargs = {'entity': entity}
     url = reverse('apis:apis_entities:generic_entities_autocomplete',
                   args=[entity.title(), 'remove'])
     label = 'Create {} from reference resources'.format(entity.title())
     button_label = 'Create'
     if ent_merge_pk:
         form_kwargs['ent_merge_pk'] = ent_merge_pk
         url = reverse('apis:apis_entities:generic_entities_autocomplete',
                       args=[entity.title()])
         label = 'Search for {0} in reference resources or db'.format(
             entity.title())
         button_label = 'Merge'
     self.helper.form_action = reverse(
         'apis:apis_entities:generic_entities_stanbol_create',
         kwargs=form_kwargs)
     self.helper.add_input(Submit('submit', button_label))
     self.fields['entity'] = autocomplete.Select2ListCreateChoiceField(
         label=label,
         widget=ListSelect2(url=url, attrs=attrs),
         validators=[URLValidator])
Example #5
0
class ExpenseItemAdminForm(ModelForm):
    payTo = ModelChoiceField(
        queryset=TransactionParty.objects.all(),
        label=_('Pay to'),
        required=True,
        widget=autocomplete.ModelSelect2(
            url='transactionParty-list-autocomplete',
            attrs={
                # This will set the input placeholder attribute:
                'data-placeholder': _('Enter a name or location'),
                # This will set the yourlabs.Autocomplete.minimumCharacters
                # options, the naming conversion is handled by jQuery
                'data-minimum-input-length': 2,
                'data-max-results': 8,
                'class': 'modern-style',
            }))

    paymentMethod = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_method_list,
        required=False,
        widget=autocomplete.ListSelect2(url='paymentMethod-list-autocomplete'))

    class Meta:
        model = ExpenseItem
        exclude = []
        widgets = {'category': ExpenseCategoryWidget}
Example #6
0
class MovieForm(forms.ModelForm):
    title = autocomplete.Select2ListCreateChoiceField(
        widget=autocomplete.ListSelect2(url='movie:movie_title_autocomplete'))

    class Meta:
        model = Movie
        fields = ('__all__')
Example #7
0
class CreateBoothForm(forms.ModelForm):
    class Meta:
        model = Career_Booth
        fields = ('interview_duration', 'rest_duration', 'date', 'time_start',
                  'time_end', 'university', 'booth_name')

    years_to_display = range(datetime.datetime.now().year,
                             datetime.datetime.now().year + 2)
    date = forms.DateField(
        widget=SelectDateWidget(years=years_to_display),
        required=True,
        initial=datetime.datetime.now(),
    )
    time_start = forms.TimeField(
        widget=SelectTimeWidget(),
        required=True,
        initial=datetime.time(9, 00),
    )
    time_end = forms.TimeField(
        widget=SelectTimeWidget(),
        required=True,
        initial=datetime.time(12, 00),
    )
    university = autocomplete.Select2ListCreateChoiceField(
        choice_list=uni_list(),
        required=True,
        widget=autocomplete.ListSelect2(url='accounts:uni-autocomplete')
        #initial = self.user.university
    )
    booth_name = forms.CharField(
        required=False,
        label='Booth Name',
        max_length=100,
        help_text='Optional. The name is only used on your calendar.')
Example #8
0
class PersonaAutoForm(forms.ModelForm):
    nombre_de_la_persona = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_choice_list,
        required=False,
        widget=autocomplete.ListSelect2(url='persona_name_lookup'),
    )

    class Meta:
        fields = ['nombre_de_la_persona']
        model = Persona
Example #9
0
class OrganizacionAutoForm(forms.ModelForm):
    nombre_de_la_organización = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_choice_list_organizacion,
        required=False,
        widget=autocomplete.ListSelect2(url='organizacion_name_lookup'),
    )

    class Meta:
        fields = ['nombre_de_la_organización']
        model = Organización
Example #10
0
class LugarAutoForm(forms.ModelForm):
    nombre_del_lugar = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_choice_list_lugar,
        required=False,
        widget=autocomplete.ListSelect2(url='lugar_name_lookup'),
    )

    class Meta:
        fields = ['nombre_del_lugar']
        model = Lugar
    def test_validate(self):
        choice_list = ['windows', 'linux']
        field = autocomplete.Select2ListCreateChoiceField(
            choice_list=choice_list)

        # validate() should allow choice outside of choices...
        field.validate('osx')

        # but not empty.
        with self.assertRaises(ValidationError):
            field.validate('')
Example #12
0
class EmployeeForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(EmployeeForm, self).__init__(*args, **kwargs)

    name = autocomplete.Select2ListCreateChoiceField(
        choice_list=getADNames,
        widget=autocomplete.ListSelect2(url='name-autocomplete'))

    manager = forms.ModelChoiceField(
        queryset=Employee.objects.all(),
        widget=autocomplete.ModelSelect2(url='employee-autocomplete'),
        required=False)

    country = CustomModelChoiceField(
        required=False,
        queryset=Group.objects.filter(name__startswith='Country'))

    departments = DepartmentsField(required=False,
                                   queryset=Department.objects.all())

    def clean(self):
        cleaned_data = super(EmployeeForm, self).clean()
        country = cleaned_data["country"]
        departments = cleaned_data['departments']
        director_of_departments = cleaned_data["director_of_department"]
        for director_of_department in director_of_departments:
            directors = Employee.objects.filter(
                director_of_department=director_of_department).filter(
                    country=country).exclude(pk=self.instance.pk)
            if directors:
                raise forms.ValidationError(''.join([
                    'Director of ' + director_of_department.name +
                    ' already exists for this country.'
                ]))
        if any(director_of_department not in departments
               for director_of_department in director_of_departments
               ) and director_of_departments is not None:
            raise forms.ValidationError(
                'Employee cannot be director of department they are not in.')
        print(country)
        print(self.request.user.groups.all())
        if not self.request.user.is_superuser and country not in self.request.user.groups.filter(
                name__startswith='Country'):
            raise forms.ValidationError("Invalid country choice.")

    class Meta:
        model = Employee
        exclude = ('is_new', )
Example #13
0
class GenericRepeatedExpenseAdminForm(ModelForm):

    paymentMethod = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_method_list,
        required=False,
        widget=autocomplete.ListSelect2(url='paymentMethod-list-autocomplete'))

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

        updatedChoices = RepeatedExpenseRule.RateRuleChoices.choices
        index = [x[0] for x in updatedChoices].index('D')
        updatedChoices = updatedChoices[:index] + (
            ('D', _('Per day')), ) + updatedChoices[index + 1:]
        self.fields.get('applyRateRule').choices = updatedChoices
Example #14
0
class DatasetForm(forms.ModelForm):
    # Change the code field of Dataset to be rendered as autocomplete field
    code = autocomplete.Select2ListCreateChoiceField(
        required=False,
        widget=autocomplete.ListSelect2(url='vizmanager:dataset-autocomplete',
                                        attrs={
                                            'data-placeholder':
                                            _('Click to load a dataset...'),
                                            'data-minimum-input-length':
                                            4
                                        }))

    def build_dimension_choices(self):
        dimensions = []

        for dim_name, dim_dict in self.instance.get_dimensions().items():
            for attr_name, attr_dict in dim_dict.get('attributes').items():
                dimensions.append(attr_dict.get('ref'))

        if not dimensions:
            dimensions = [strings.DEFAULT_DIMENSIONS_STRING]

        return zip(dimensions, dimensions)

    def build_measure_choices(self):
        measures = self.instance.get_measures()

        if not measures:
            measures = [strings.DEFAULT_MEASURES_STRING]

        return zip(measures, measures)

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

        # initialize the DatasetForm's 'code' if the form is not empty
        ds = kwargs.get('instance')
        if ds is not None:
            attrs = self.fields.get('code').widget.attrs
            attrs['data-placeholder'] = ds.code

        # create dynamic choices field for the available dimensions
        self.fields['initial_dimension'] = forms.ChoiceField(
            choices=self.build_dimension_choices())

        # create dynamic choices field for the available measures
        self.fields['initial_measure'] = forms.ChoiceField(
            choices=self.build_measure_choices())
Example #15
0
class FleetAddMemberForm(forms.Form):
    fleet = forms.IntegerField(widget=forms.HiddenInput(),
                               disabled=True,
                               required=False)
    discord_username = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_discord_names,
        required=False,
        widget=autocomplete.ListSelect2(url="discord-username-autocomplete"),
    )
    character = forms.ModelChoiceField(
        required=False,
        queryset=Character.objects.all(),
        initial=0,
        widget=autocomplete.ModelSelect2(url="character-autocomplete",
                                         forward=["discord_username",
                                                  "fleet"]),
    )

    class Meta:
        exclude = ("discord_username", )
Example #16
0
 def __init__(self, entity, *args, **kwargs):
     attrs = {
         'data-placeholder': 'Type to get suggestions',
         'data-minimum-input-length': 3,
         'data-html': True,
         'style': 'width: auto'
     }
     super(GenericEntitiesStanbolForm, self).__init__(*args, **kwargs)
     self.entity = entity
     self.helper = FormHelper()
     self.helper.form_action = reverse(
         'entities:generic_entities_stanbol_create',
         kwargs={'entity': entity})
     self.helper.add_input(Submit('submit', 'Create'))
     self.fields['entity'] = autocomplete.Select2ListCreateChoiceField(
         label='Create {} from reference resources'.format(entity.title()),
         widget=autocomplete.ListSelect2(
             url='/entities/autocomplete/{}/remove'.format(entity),
             attrs=attrs),
         validators=[URLValidator])
Example #17
0
    def __init__(self, *args, **kwargs):
        super(SundayHighlighterForm, self).__init__(*args, **kwargs)
        attrs = {
            'data-placeholder': 'Type to get suggestions',
            'data-minimum-input-length': 3,
            'data-html': True,
            'style': 'width: 100%'
        }
        self.fields['sunday_rep'] = autocomplete.Select2ListCreateChoiceField(
            label='Relation type',
            widget=ListSelect2(
                #url='/vocabularies/autocomplete/{}{}relation/normal'.format(lst_src_target[0].lower(), lst_src_target[1].lower()),
                url=reverse(
                    'apis:apis_vocabularies:generic_vocabularies_autocomplete',
                    args=['sundayrepresentations', 'normal']),
                attrs=attrs))

        if self.instance:
            a = self.instance
            ent = a.entity_link
            self.fields['sunday_rep'].initial = (ent.pk, ent.name)
Example #18
0
class OrganizationForm(forms.ModelForm):
    """
    Initialize the DatasetForm code if the form is not empty
    """
    def __init__(self, *args, **kwargs):
        super(OrganizationForm, self).__init__(*args, **kwargs)
        ds = kwargs.get('instance')
        if ds is not None:
            attrs = self.fields.get('url').widget.attrs
            attrs['data-placeholder'] = ds.url

    """
    Changes the code field of Dataset to be rendered as autocomplete field
    """
    url = autocomplete.Select2ListCreateChoiceField(
        required=True,
        widget=autocomplete.ListSelect2(
            url='vizmanager:organization-autocomplete',
            attrs={
                'data-placeholder': _('Click to load an Organization...'),
                'data-minimum-input-length': 1
            }))
Example #19
0
class ExpenseReportingForm(EventAutocompleteForm, forms.ModelForm):
    payTo = forms.ModelChoiceField(
        queryset=TransactionParty.objects.all(),
        label=_('Pay to'),
        required=True,
        widget=autocomplete.ModelSelect2(
            url='transactionParty-list-autocomplete',
            attrs={
                # This will set the input placeholder attribute:
                'data-placeholder': _('Enter a name or location'),
                # This will set the yourlabs.Autocomplete.minimumCharacters
                # options, the naming conversion is handled by jQuery
                'data-minimum-input-length': 2,
                'data-max-results': 8,
                'class': 'modern-style',
            }))

    payBy = forms.ChoiceField(widget=forms.RadioSelect,
                              choices=PAYBY_CHOICES,
                              label=_('Report this expense as:'),
                              initial=2)
    paymentMethod = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_method_list,
        required=False,
        widget=autocomplete.ListSelect2(url='paymentMethod-list-autocomplete'),
        label=_('Payment method'),
    )

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        user_id = getattr(user, 'id', None)

        if user_id:
            kwargs.update(
                initial={
                    'payTo':
                    TransactionParty.objects.get_or_create(
                        user=user, defaults={'name': user.get_full_name()})
                    [0].id,
                })

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

        self.helper = FormHelper()

        # The hidden input of accrual date must be passed as a naive datetime.
        # Django will take care of converting it to local time
        accrualDate_field = Field(
            'accrualDate',
            type="hidden",
            value=timezone.make_naive(timezone.now())
            if timezone.is_aware(timezone.now()) else timezone.now())

        if user and user.has_perm('financial.mark_expenses_paid'):
            payment_section = Div(
                Div(HTML(
                    '<a data-toggle="collapse" href="#collapsepayment">%s</a> (%s)'
                    % (_('Mark as Approved/Paid'), _('click to expand'))),
                    css_class='card-header'),
                Div(
                    'approved',
                    'paid',
                    Div(
                        Field('paymentDate', css_class='datepicker'),
                        HTML(
                            '<div style="margin: auto 1em;"><button id="payment-event-start" class="btn btn-outline-secondary">%s</button></div>'
                            % _('Event Start Date')),
                        css_class='form-row',
                    ),
                    'paymentMethod',
                    HTML(
                        '<p style="margin-top: 30px;"><strong>%s</strong> %s</p>'
                        %
                        (_('Note:'),
                         _('For accounting purposes, please do not mark expenses as paid unless they have already been paid to the recipient.'
                           ))),
                    css_class='card-body collapse',
                    id='collapsepayment',
                ),
                css_class='card my-4')
        else:
            payment_section = None

        # Add category button should only appear for users who are allowed to add categories
        if user.has_perm('financial.add_expensecategory'):
            related_url = reverse('admin:financial_expensecategory_add'
                                  ) + '?_to_field=id&_popup=1'
            added_html = [
                '<a href="%s" class="btn btn-outline-secondary related-widget-wrapper-link add-related" id="add_id_category"> '
                % related_url,
                '<img src="%sadmin/img/icon-addlink.svg" width="10" height="10" alt="%s"/></a>'
                %
                (getattr(settings, 'STATIC_URL', '/static/'), _('Add Another'))
            ]
            category_field = Div(Div('category', css_class='col-sm-11'),
                                 Div(HTML('\n'.join(added_html)),
                                     css_class='col-sm-1',
                                     style='margin-top: 25px;'),
                                 css_class='related-widget-wrapper row')
        else:
            category_field = Div('category')

        self.fields['event'].label = _('Event (optional)')
        self.fields['event'].required = False

        self.helper.layout = Layout(
            Field('submissionUser', type="hidden", value=user_id),
            'payTo',
            'payBy',
            category_field,
            'description',
            'hours',
            'total',
            'event',
            'reimbursement',
            accrualDate_field,
            payment_section,
            'attachment',
            Submit('submit', _('Submit')),
        )

    def clean(self):
        # Custom cleaning ensures that user, hours, and total
        # are not reported where not necessary.
        super(ExpenseReportingForm, self).clean()

        payBy = self.cleaned_data.get('payBy')
        hours = self.cleaned_data.get('hours')
        total = self.cleaned_data.get('total')

        paid = self.cleaned_data.get('paid')
        paymentDate = self.cleaned_data.get('paymentDate')

        event = self.cleaned_data.get('event')

        # Automatically marks expenses that are paid
        # upon submission as accruing at the date of payment.
        if paid and paymentDate:
            self.cleaned_data['accrualDate'] = paymentDate
        else:
            self.cleaned_data.pop('paymentDate', None)

        # If an event has been specified, then that takes precedence for setting
        # the accrual date of the expense.
        if event and getattr(event, 'startTime', None):
            self.cleaned_data['accrualDate'] = event.startTime

        if payBy == '1' and total:
            self.cleaned_data.pop('total', None)
        if payBy == '2' and hours:
            self.cleaned_data.pop('hours', None)
        return self.cleaned_data

    class Meta:
        model = ExpenseItem
        fields = [
            'submissionUser', 'payTo', 'category', 'description', 'hours',
            'total', 'reimbursement', 'attachment', 'approved', 'paid',
            'paymentDate', 'paymentMethod', 'accrualDate', 'event'
        ]
        widgets = {
            'category': ExpenseCategoryWidget,
        }

    class Media:
        js = ('admin/js/admin/RelatedObjectLookups.js',
              'jquery-ui/jquery-ui.min.js', 'js/expense_reporting.js')
        css = {
            'all': ('jquery-ui/jquery-ui.min.css', ),
        }
class TForm(forms.ModelForm):
    test = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_choice_list,
        required=False,
        widget=autocomplete.ListSelect2(url='select2_list'))
Example #21
0
class RevenueReportingForm(forms.ModelForm):
    associateWith = forms.ChoiceField(
        widget=forms.RadioSelect,
        choices=REVENUE_ASSOCIATION_CHOICES,
        label=_('This revenue is associated with:'),
        initial=1)
    currentlyHeldBy = forms.ModelChoiceField(
        queryset=User.objects.filter(
            Q(is_staff=True) | Q(staffmember__isnull=False)),
        label=_('Cash currently in possession of'),
        required=False,
        widget=autocomplete.ModelSelect2(
            url='autocompleteUser',
            attrs={
                # This will set the input placeholder attribute:
                'data-placeholder': _('Enter a user name'),
                # This will set the yourlabs.Autocomplete.minimumCharacters
                # options, the naming conversion is handled by jQuery
                'data-minimum-input-length': 2,
                'data-max-results': 4,
                'class': 'modern-style',
            }))
    paymentMethod = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_method_list,
        required=False,
        widget=autocomplete.ListSelect2(url='paymentMethod-list-autocomplete'))

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', _('Submit')))
        user = kwargs.pop('user', None)

        if hasattr(user, 'id'):
            kwargs.update(initial={'submissionUser': user.id})
        super(RevenueReportingForm, self).__init__(*args, **kwargs)
        self.fields['submissionUser'].widget = forms.HiddenInput()
        self.fields['invoiceNumber'].widget = forms.HiddenInput()
        self.fields["invoiceItem"] = InvoiceItemChoiceField(
            queryset=InvoiceItem.objects.none(), required=False)

        # re-order fields to put the associateWith RadioSelect first.
        newFields = OrderedDict()
        newFields['associateWith'] = self.fields['associateWith']
        for key, field in self.fields.items():
            if key not in ['associateWith']:
                newFields[key] = field
        self.fields = newFields

    def clean_description(self):
        ''' Avoid empty descriptions '''
        return self.cleaned_data['description'] or _('Form Submitted Revenue')

    def clean_invoiceNumber(self):
        ''' Create a unique invoice number '''
        return 'SUBMITTED_%s_%s' % (self.cleaned_data['submissionUser'].id,
                                    timezone.now().strftime('%Y%m%d%H%M%S'))

    def clean(self):
        # Custom cleaning ensures that revenues are not attributed
        # to both a series and to an event.
        super(RevenueReportingForm, self).clean()

        associateWith = self.cleaned_data.get('associateWith')
        event = self.cleaned_data.get('event')

        if associateWith in ['1', '3'] and event:
            self.cleaned_data.pop('event', None)
            self.cleaned_data.pop('invoiceItem', None)

        return self.cleaned_data

    class Meta:
        model = RevenueItem
        fields = [
            'submissionUser', 'invoiceNumber', 'category', 'description',
            'event', 'invoiceItem', 'receivedFromName', 'paymentMethod',
            'currentlyHeldBy', 'total', 'attachment'
        ]

    class Media:
        js = ('js/revenue_reporting.js', )
Example #22
0
class RevenueReportingForm(EventAutocompleteForm, forms.ModelForm):
    '''
    This form is used in the revenue reporting view for quick generation of RevenueItems.
    '''

    receivedFrom = forms.ModelChoiceField(
        queryset=TransactionParty.objects.all(),
        label=_('Received from'),
        required=False,
        widget=autocomplete.ModelSelect2(
            url='transactionParty-list-autocomplete',
            attrs={
                # This will set the input placeholder attribute:
                'data-placeholder': _('Enter a name or location'),
                # This will set the yourlabs.Autocomplete.minimumCharacters
                # options, the naming conversion is handled by jQuery
                'data-minimum-input-length': 2,
                'data-max-results': 8,
                'class': 'modern-style',
            }))

    currentlyHeldBy = forms.ModelChoiceField(
        queryset=User.objects.filter(
            Q(is_staff=True) | Q(staffmember__isnull=False)),
        label=_('Cash currently in possession of'),
        required=False,
        widget=autocomplete.ModelSelect2(
            url='autocompleteUser',
            attrs={
                # This will set the input placeholder attribute:
                'data-placeholder': _('Enter a user name'),
                # This will set the yourlabs.Autocomplete.minimumCharacters
                # options, the naming conversion is handled by jQuery
                'data-minimum-input-length': 2,
                'data-max-results': 4,
                'class': 'modern-style',
            }))
    paymentMethod = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_method_list,
        required=False,
        widget=autocomplete.ListSelect2(url='paymentMethod-list-autocomplete'),
        label=_('Payment method'),
    )

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)

        if hasattr(user, 'id'):
            kwargs.update(initial={'submissionUser': user.id})
        super(RevenueReportingForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper()

        detail_section = Div(Div(HTML(
            '<a data-toggle="collapse" href="#collapsedetails">%s</a> (%s)' %
            (_('Adjustments/Fees'), _('click to expand'))),
                                 css_class='card-header'),
                             Div(
                                 'total',
                                 'adjustments',
                                 'fees',
                                 css_class='card-body collapse',
                                 id='collapsedetails',
                             ),
                             css_class='card my-4')

        event_section = Div(Div(HTML(
            '<a data-toggle="collapse" href="#collapseevent">%s</a> (%s)' %
            (_('Event/Invoice item (optional)'), _('click to expand'))),
                                css_class='card-header'),
                            Div(
                                'event',
                                'invoiceItem',
                                css_class='card-body collapse',
                                id='collapseevent',
                            ),
                            css_class='card my-4')

        if user and user.has_perm('financial.mark_revenues_received'):
            receipt_section = Div(
                Div(HTML(
                    '<a data-toggle="collapse" href="#collapsereceipt">%s</a> (%s)'
                    % (_('Mark as Received'), _('click to expand'))),
                    css_class='card-header'),
                Div(
                    'received',
                    Div(
                        Field('receivedDate', css_class='datepicker'),
                        HTML(
                            '<div style="margin: auto 1em;"><button id="received-event-start" class="btn btn-outline-secondary">%s</button></div>'
                            % _('Event Start Date')),
                        css_class='form-row',
                    ),
                    'currentlyHeldBy',
                    # The hidden input of accrual date must be passed as a naive datetime.
                    # Django will take care of converting it to local time
                    HTML(
                        '<p style="margin-top: 30px;"><strong>%s</strong> %s</p>'
                        %
                        (_('Note:'),
                         _('For accounting purposes, please do not mark revenues '
                           +
                           'as received until the money is in our possession.')
                         )),
                    css_class='card-body collapse',
                    id='collapsereceipt',
                ),
                css_class='card my-4')
        else:
            receipt_section = None

        self.fields["invoiceItem"] = InvoiceItemChoiceField(
            queryset=InvoiceItem.objects.none(), required=False)
        self.fields['event'].required = False

        # Handled by the model's save() method
        self.fields['total'].required = False
        self.fields['fees'].required = False
        self.fields['adjustments'].required = False

        self.helper.layout = Layout(
            Field('submissionUser', type="hidden", value=getattr(user, 'id')),
            Field('invoiceNumber', type="hidden"),
            'category',
            'description',
            'receivedFrom',
            'paymentMethod',
            'grossTotal',
            detail_section,
            event_section,
            receipt_section,
            'attachment',
            Submit('submit', _('Submit')),
        )

    def clean_description(self):
        ''' Avoid empty descriptions '''
        return self.cleaned_data['description'] or _('Form Submitted Revenue')

    def clean_invoiceNumber(self):
        ''' Create a unique invoice number '''
        return 'SUBMITTED_%s_%s' % (getattr(
            self.cleaned_data['submissionUser'], 'id',
            'None'), timezone.now().strftime('%Y%m%d%H%M%S'))

    class Meta:
        model = RevenueItem
        fields = [
            'submissionUser', 'invoiceNumber', 'category', 'description',
            'event', 'invoiceItem', 'receivedFrom', 'paymentMethod',
            'currentlyHeldBy', 'grossTotal', 'total', 'adjustments', 'fees',
            'attachment', 'received', 'receivedDate'
        ]

    class Media:
        js = (
            'js/revenue_reporting.js',
            'jquery-ui/jquery-ui.min.js',
        )
        css = {
            'all': ('jquery-ui/jquery-ui.min.css', ),
        }
Example #23
0
    def __init__(self, siteID=None, highlighter=False, *args, **kwargs):
        """
        Generic Form for relations.
        :param siteID: ID of the entity the form is used on
        :param entity_type: Entity type of the entity the form is used on
        :param relation_form: Type of relation form.
        :param instance: instance of relation.
        :param highlighter: whether the form is used in the highlighter
        :type siteID: int
        :type entity_type: object or int
        :type relation_form: object or int
        :type instance: object
        :type highlighter: bool
        """
        attrs = {
            'data-placeholder': 'Type to get suggestions',
            'data-minimum-input-length': 3,
            'data-html': True,
            'style': 'width: 100%'
        }
        css_notes = 'LS'
        self.highlighter = highlighter
        entity_type = kwargs.pop('entity_type')
        if type(entity_type) != str:
            entity_type = entity_type.__name__
        self.relation_form = kwargs.pop('relation_form')
        if type(self.relation_form) == str:
            self.relation_form = ContentType.objects.get(
                app_label='relations',
                model=self.relation_form.lower()).model_class()
        self.request = kwargs.pop('request', False)
        super(GenericRelationForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        self.fields['relation_type'] = forms.CharField(label='Relation type',
                                                       required=True)
        self.helper = FormHelper()
        self.helper.form_class = '{}Form'.format(str(self.relation_form))
        self.helper.form_tag = False
        lst_src_target = re.findall('[A-Z][^A-Z]*',
                                    self.relation_form.__name__)
        if lst_src_target[0] == lst_src_target[1]:
            if instance and instance.id:
                if getattr(instance, 'related_{}A_id'.format(
                        lst_src_target[0].lower())) == int(siteID):
                    self.rel_accessor = (lst_src_target[1], True,
                                         'related_{}B'.format(
                                             lst_src_target[1].lower()),
                                         'related_{}A'.format(
                                             lst_src_target[0].lower()))
                else:
                    self.rel_accessor = (lst_src_target[1], False,
                                         'related_{}A'.format(
                                             lst_src_target[1].lower()),
                                         'related_{}B'.format(
                                             lst_src_target[0].lower()))
            else:
                self.rel_accessor = (lst_src_target[1], True,
                                     'related_{}B'.format(
                                         lst_src_target[1].lower()),
                                     'related_{}A'.format(
                                         lst_src_target[0].lower()))
            self.fields[
                'relation_type'] = autocomplete.Select2ListCreateChoiceField(
                    label='Relation type',
                    widget=autocomplete.ListSelect2(
                        url='/vocabularies/autocomplete/{}{}relation/normal'.
                        format(lst_src_target[0].lower(),
                               lst_src_target[1].lower()),
                        attrs=attrs))
            self.fields['target'] = autocomplete.Select2ListCreateChoiceField(
                label=lst_src_target[1],
                widget=autocomplete.ListSelect2(
                    url='/entities/autocomplete/{}'.format(
                        lst_src_target[1].lower()),
                    attrs=attrs),
                validators=[URLValidator])
        elif entity_type.lower() == lst_src_target[0].lower():
            self.rel_accessor = (lst_src_target[1], True, 'related_{}'.format(
                lst_src_target[1].lower()), 'related_{}'.format(
                    lst_src_target[0].lower()))
            self.fields[
                'relation_type'] = autocomplete.Select2ListCreateChoiceField(
                    label='Relation type',
                    widget=autocomplete.ListSelect2(
                        url='/vocabularies/autocomplete/{}{}relation/normal'.
                        format(lst_src_target[0].lower(),
                               lst_src_target[1].lower()),
                        attrs=attrs))
            self.fields['target'] = autocomplete.Select2ListCreateChoiceField(
                label=lst_src_target[1],
                widget=autocomplete.ListSelect2(
                    url='/entities/autocomplete/{}'.format(
                        lst_src_target[1].lower()),
                    attrs=attrs),
                validators=[URLValidator])
        elif entity_type.lower() == lst_src_target[1].lower():
            self.rel_accessor = (lst_src_target[0], False, 'related_{}'.format(
                lst_src_target[0].lower()), 'related_{}'.format(
                    lst_src_target[1].lower()))
            self.fields[
                'relation_type'] = autocomplete.Select2ListCreateChoiceField(
                    label='Relation type',
                    widget=autocomplete.ListSelect2(
                        url='/vocabularies/autocomplete/{}{}relation/reverse'.
                        format(lst_src_target[0].lower(),
                               lst_src_target[1].lower()),
                        attrs=attrs))
            self.fields['target'] = autocomplete.Select2ListCreateChoiceField(
                label=lst_src_target[0],
                widget=autocomplete.ListSelect2(
                    url='/entities/autocomplete/{}'.format(
                        lst_src_target[0].lower()),
                    attrs=attrs),
                validators=[URLValidator])
        else:
            print('no hit rel_accessor')
        if instance and instance.id:
            self.fields['target'].choices = [
                (str(
                    Uri.objects.filter(
                        entity=getattr(instance, self.rel_accessor[2]))[0]),
                 str(getattr(instance, self.rel_accessor[2])))
            ]
            self.fields['target'].initial = (str(
                Uri.objects.filter(
                    entity=getattr(instance, self.rel_accessor[2]))[0]),
                                             str(
                                                 getattr(
                                                     instance,
                                                     self.rel_accessor[2])))
            if self.rel_accessor[1]:
                self.fields['relation_type'].choices = [
                    (instance.relation_type.id, instance.relation_type.label)
                ]
                self.fields['relation_type'].initial = (
                    instance.relation_type.id, instance.relation_type.label)
            else:
                self.fields['relation_type'].choices = [
                    (instance.relation_type.id,
                     instance.relation_type.label_reverse)
                ]
                self.fields['relation_type'].initial = (
                    instance.relation_type.id,
                    instance.relation_type.label_reverse)
        if highlighter:
            css_notes = 'HL'

        self.helper.include_media = False
        self.helper.layout = Layout(
            'relation_type', 'target', 'start_date_written',
            'end_date_written',
            Accordion(
                AccordionGroup('Notes and References',
                               'notes',
                               'references',
                               active=False,
                               css_id="{}_{}_notes_refs".format(
                                   self.relation_form.__name__, css_notes))))

        if highlighter:
            self.fields['HL_start'] = forms.IntegerField(
                widget=forms.HiddenInput)
            self.fields['HL_end'] = forms.IntegerField(
                widget=forms.HiddenInput)
            self.fields['HL_text_id'] = forms.CharField(
                widget=forms.HiddenInput)
            self.helper.layout.extend(['HL_start', 'HL_end', 'HL_text_id'])
Example #24
0
class ExpenseReportingForm(forms.ModelForm):
    payTo = forms.ChoiceField(widget=forms.RadioSelect,
                              choices=RECIPIENT_CHOICES,
                              label=_('This expense to be paid to:'),
                              initial=1)
    payBy = forms.ChoiceField(widget=forms.RadioSelect,
                              choices=PAYBY_CHOICES,
                              label=_('Report this expense as:'),
                              initial=1)
    paymentMethod = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_method_list,
        required=False,
        widget=autocomplete.ListSelect2(url='paymentMethod-list-autocomplete'),
        label=_('Payment method'),
    )

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        user_id = getattr(user, 'id')

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

        self.helper = FormHelper()

        if user.has_perm('financial.mark_expenses_paid'):
            payment_section = Div(
                Div(HTML(
                    '<a data-toggle="collapse" href="#collapsepayment">%s</a> (%s)'
                    % (_('Mark as Approved/Paid'), _('click to expand'))),
                    css_class='card-header'),
                Div(
                    'approved',
                    'paid',
                    Div(
                        Field('paymentDate',
                              css_class='datepicker',
                              wrapper_class='col-md-3'),
                        Field('paymentMethod', wrapper_class='col-md-6'),
                        css_class='form-row',
                    ),
                    # The hidden input of accrual date must be passed as a naive datetime.
                    # Django will take care of converting it to local time
                    Field(
                        'accrualDate',
                        type="hidden",
                        value=timezone.make_naive(timezone.now()) if
                        timezone.is_aware(timezone.now()) else timezone.now()),
                    HTML(
                        '<p style="margin-top: 30px;"><strong>%s</strong> %s</p>'
                        %
                        (_('Note:'),
                         _('For accounting purposes, please do not mark expenses as paid unless they have already been paid to the recipient.'
                           ))),
                    css_class='card-body collapse',
                    id='collapsepayment',
                ),
                css_class='card my-4')
        else:
            payment_section = None

        # Add category button should only appear for users who are allowed to add categories
        if user.has_perm('financial.add_expensecategory'):
            related_url = reverse('admin:financial_expensecategory_add'
                                  ) + '?_to_field=id&_popup=1'
            added_html = [
                '<a href="%s" class="btn btn-outline-secondary related-widget-wrapper-link add-related" id="add_id_category"> '
                % related_url,
                '<img src="%sadmin/img/icon-addlink.svg" width="10" height="10" alt="%s"/></a>'
                %
                (getattr(settings, 'STATIC_URL', '/static/'), _('Add Another'))
            ]
            category_field = Div(Div('category', css_class='col-sm-11'),
                                 Div(HTML('\n'.join(added_html)),
                                     css_class='col-sm-1',
                                     style='margin-top: 25px;'),
                                 css_class='related-widget-wrapper row')
        else:
            category_field = Div('category')

        self.helper.layout = Layout(
            Field('submissionUser', type="hidden", value=user_id),
            Field('payToUser', type="hidden", value=user_id),
            'payTo',
            'payBy',
            'payToLocation',
            'payToName',
            category_field,
            'description',
            'hours',
            'total',
            'reimbursement',
            payment_section,
            'attachment',
            Submit('submit', _('Submit')),
        )

    def clean(self):
        # Custom cleaning ensures that user, hours, and total
        # are not reported where not necessary.
        super(ExpenseReportingForm, self).clean()

        payTo = self.cleaned_data.get('payTo')
        payToUser = self.cleaned_data.get('payToUser')
        payToLocation = self.cleaned_data.get('payToLocation')
        payToName = self.cleaned_data.get('payToName')
        payBy = self.cleaned_data.get('payBy')
        hours = self.cleaned_data.get('hours')
        total = self.cleaned_data.get('total')

        paid = self.cleaned_data.get('paid')
        paymentDate = self.cleaned_data.get('paymentDate')

        # Automatically marks expenses that are paid
        # upon submission as accruing at the date of payment.
        if paid and paymentDate:
            self.cleaned_data['accrualDate'] = paymentDate
        else:
            self.cleaned_data.pop('paymentDate', None)

        if payTo != '1' and payToUser:
            self.cleaned_data.pop('payToUser', None)
        if payTo != '2' and payToLocation:
            self.cleaned_data.pop('payToLocation', None)
        if payTo != '3' and payToName:
            self.cleaned_data.pop('payToName', None)

        if payBy == '1' and total:
            self.cleaned_data.pop('total', None)
        if payBy == '2' and hours:
            self.cleaned_data.pop('hours', None)
        return self.cleaned_data

    class Meta:
        model = ExpenseItem
        fields = [
            'submissionUser', 'payToUser', 'payToLocation', 'payToName',
            'category', 'description', 'hours', 'total', 'reimbursement',
            'attachment', 'approved', 'paid', 'paymentDate', 'paymentMethod',
            'accrualDate'
        ]
        widgets = {
            'category': ExpenseCategoryWidget,
        }

    class Media:
        js = ('admin/js/admin/RelatedObjectLookups.js',
              'jquery-ui/jquery-ui.min.js', 'js/expense_reporting.js')
        css = {
            'all': ('jquery-ui/jquery-ui.min.css', ),
        }
class ExpressionStudyCreateForm(forms.ModelForm):

    ome = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/ome-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )

    experimental_design = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/experimental-design-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )

    topics = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/topic-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )

    tissues = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/tissue-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )
    age = SimpleArrayField(forms.CharField(), required=False)

    sex = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/sex-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )

    dev_stage = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/dev-stage-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )

    antibody = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/antibody-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )

    mutant = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/mutant-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )

    cell_sorted = autocomplete.Select2ListCreateChoiceField(
                required=False,
                widget=autocomplete.TagSelect2(url='/studies/cell-sorted-autocomplete', attrs={"data-tags":"true", "data-html":True})
              )

    keywords = SimpleArrayField(forms.CharField(), required=False)

    class Meta:
        model = ExpressionStudy
        fields = ["article", "pmid", "samples_count", "read_groups", "edit_groups"]

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(ExpressionStudyCreateForm, self).__init__(*args, **kwargs)
        self.fields['read_groups'].help_text = "Groups with viewing permission on project and subentities. Will be ignored if the visibility is set to public. Use 'ctrl' to select multiple/unselect."
        self.fields['edit_groups'].help_text = "Groups with editing permission on project and subentities. Use 'ctrl' to select multiple/unselect."

        # TODO : Give link to group creation interface?
        groups = self.user.groups.all()
        self.fields['read_groups'].queryset = groups
        self.fields['edit_groups'].queryset = groups

        self.fields.keyOrder = [
            'article',
            'pmid',
            'samples_count',
            'species'
            'ome',
            'technology',
            'experimental_design',
            'topics',
            'tissues',
            'age',
            'sex',
            'dev_stage',
            'antibody'
            'mutant',
            'cell_sorted',
            'edit_groups',
            'read_groups']

        self.helper = FormHelper(self)
        self.helper.form_method = 'POST'
        self.helper.add_input(Submit('save', 'Save'))
Example #26
0
class ExpenseReportingForm(forms.ModelForm):
    payTo = forms.ChoiceField(widget=forms.RadioSelect,
                              choices=RECIPIENT_CHOICES,
                              label=_('This expense to be paid to:'),
                              initial=1)
    payBy = forms.ChoiceField(widget=forms.RadioSelect,
                              choices=PAYBY_CHOICES,
                              label=_('Report this expense as:'),
                              initial=1)
    paymentMethod = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_method_list,
        required=False,
        widget=autocomplete.ListSelect2(url='paymentMethod-list-autocomplete'))

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        user_id = getattr(user, 'id')

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

        self.helper = FormHelper()

        if user.has_perm('financial.mark_expenses_paid'):
            payment_section = Div(
                Div(HTML(
                    '<div class="panel-title"><a data-toggle="collapse" href="#collapsepayment">%s</a> (%s)</div>'
                    % (_('Mark as Approved/Paid'), _('click to expand'))),
                    css_class='panel-heading'),
                Div(
                    'approved',
                    'paid',
                    Div(Field('paymentDate', css_class='datepicker'),
                        'paymentMethod',
                        css_class='form-inline'),
                    Field('accrualDate', type="hidden", value=timezone.now()),
                    HTML(
                        '<p style="margin-top: 30px;"><strong>%s</strong> %s</p>'
                        %
                        (_('Note:'),
                         _('For accounting purposes, please do not mark expenses as paid unless they have already been paid to the recipient.'
                           ))),
                    css_class='panel-body collapse',
                    id='collapsepayment',
                ),
                css_class='panel panel-default')
        else:
            payment_section = None

        self.helper.layout = Layout(
            Field('submissionUser', type="hidden", value=user_id),
            Field('payToUser', type="hidden", value=user_id),
            'payTo',
            'payBy',
            'payToLocation',
            'payToName',
            'category',
            'description',
            'hours',
            'total',
            'reimbursement',
            payment_section,
            'attachment',
            Submit('submit', _('Submit')),
        )

    def clean(self):
        # Custom cleaning ensures that user, hours, and total
        # are not reported where not necessary.
        super(ExpenseReportingForm, self).clean()

        payTo = self.cleaned_data.get('payTo')
        payToUser = self.cleaned_data.get('payToUser')
        payToLocation = self.cleaned_data.get('payToLocation')
        payToName = self.cleaned_data.get('payToName')
        payBy = self.cleaned_data.get('payBy')
        hours = self.cleaned_data.get('hours')
        total = self.cleaned_data.get('total')

        paid = self.cleaned_data.get('paid')
        paymentDate = self.cleaned_data.get('paymentDate')

        # Automatically marks expenses that are paid
        # upon submission as accruing at the date of payment.
        if paid:
            self.cleaned_data['accrualDate'] = paymentDate
        else:
            self.cleaned_data.pop('paymentDate', None)

        if payTo != '1' and payToUser:
            self.cleaned_data.pop('payToUser', None)
        if payTo != '2' and payToLocation:
            self.cleaned_data.pop('payToLocation', None)
        if payTo != '3' and payToName:
            self.cleaned_data.pop('payToName', None)

        if payBy == '1' and total:
            self.cleaned_data.pop('total', None)
        if payBy == '2' and hours:
            self.cleaned_data.pop('hours', None)
        return self.cleaned_data

    class Meta:
        model = ExpenseItem
        fields = [
            'submissionUser', 'payToUser', 'payToLocation', 'payToName',
            'category', 'description', 'hours', 'total', 'reimbursement',
            'attachment', 'approved', 'paid', 'paymentDate', 'paymentMethod',
            'accrualDate'
        ]
        widgets = {
            'category': ExpenseCategoryWidget,
        }

    class Media:
        js = (
            'js/expense_reporting.js',
            'jquery-ui/jquery-ui.min.js',
        )
        css = {
            'all': ('jquery-ui/jquery-ui.min.css', ),
        }
Example #27
0
class InventoryitemForm(forms.ModelForm):
    class Meta:
        model = Inventoryitem
        fields = ('__all__')

    item_indate = forms.DateField(label='Date entered DB',
                                  initial=datetime.date.today)

    item_pickup = forms.ModelChoiceField(
        label='Pickup #',
        queryset=Pickup.objects.all(),
        widget=autocomplete.ModelSelect2(url='pickup-autocomplete'))

    #  item_category  = autocomplete.Select2ListCreateChoiceField(choice_list=None, widget=autocomplete.ListSelect2(url='category-autocomplete'))

    item_category = forms.ModelChoiceField(
        label='Item Category',
        queryset=Category.objects.only('category'),
        to_field_name='category',
        widget=autocomplete.ListSelect2(url='category-autocomplete'))

    item_segment = autocomplete.Select2ListCreateChoiceField(
        choice_list=Segment.objects.all(),
        widget=autocomplete.ListSelect2(url='segment-autocomplete',
                                        forward=['item_category']),
    )

    item_type = autocomplete.Select2ListCreateChoiceField(
        choice_list=Type.objects.all(),
        widget=autocomplete.ListSelect2(
            url='type-autocomplete', forward=['item_category',
                                              'item_segment']),
        required=False,
    )
    item_quantity = forms.IntegerField(initial=1, required=False)

    item_brand = autocomplete.Select2ListCreateChoiceField(
        choice_list=Brand.objects.all(),
        widget=autocomplete.ListSelect2(url='brand-autocomplete'),
        required=False,
    )

    item_size = autocomplete.Select2ListCreateChoiceField(
        choice_list=Size.objects.all(),
        widget=autocomplete.ListSelect2(
            url='size-autocomplete', forward=['item_category',
                                              'item_segment']),
        required=False,
    )

    item_color = forms.CharField(required=False, disabled=True)

    colors = forms.ModelMultipleChoiceField(
        queryset=Color.objects.all(),
        widget=autocomplete.ModelSelect2Multiple(url='color-autocomplete'),
        required=False)

    #    colors = forms.ModelMultipleChoiceField(queryset=Color.objects.all(), required=False)

    def get_firstassessment_choice_list():
        return ['Sale', 'Donation', 'Recycling']

    item_firstassessment = autocomplete.Select2ListChoiceField(
        choice_list=get_firstassessment_choice_list,
        widget=autocomplete.ListSelect2(url='firstassessment-autocomplete'))

    item_donationvalue = forms.DecimalField(min_value=0,
                                            decimal_places=2,
                                            required=False)

    def get_condition_choice_list():
        return [
            'New in a box', 'New w/o tags', 'New w tags', 'Like new',
            'Gently used', 'Used', 'w defect'
        ]

    item_condition = autocomplete.Select2ListChoiceField(
        choice_list=get_condition_choice_list,
        widget=autocomplete.ListSelect2(url='condition-autocomplete'),
        required=False)

    # cut = forms.ModelMultipleChoiceField(
    #     queryset= Cut.objects.all(),
    #     widget=forms.CheckboxSelectMultiple(),
    # )

    #    item_cut = autocomplete.Select2ListCreateChoiceField(choice_list=Cut.objects.all(), widget=autocomplete.ListSelect2(url='cut-autocomplete', forward=['itemtype']), required=False,)
    item_cut = forms.CharField(required=False, disabled=True)
    cuts = forms.ModelMultipleChoiceField(
        queryset=Cut.objects.all(),
        widget=autocomplete.ModelSelect2Multiple(url='cut-autocomplete',
                                                 forward=['itemtype']),
        required=False)
    item_style = forms.CharField(required=False, disabled=True)
    additional_info = forms.CharField(
        label='Additional information if necessary. Useful for unique items.',
        required=False,
        widget=forms.Textarea)

    #  item_fabric = autocomplete.Select2ListCreateChoiceField(choice_list=Fabric.objects.all(), widget=autocomplete.ListSelect2(url='fabric-autocomplete'), required=False, disabled=True)
    item_fabric = forms.CharField(required=False, disabled=True)

    item_usecase = forms.CharField(required=False, disabled=True)

    usecases = forms.ModelMultipleChoiceField(
        queryset=Usecase.objects.all(),
        widget=autocomplete.ModelSelect2Multiple(url='usecase-autocomplete'),
        required=False)

    item_postprice = forms.DecimalField(
        decimal_places=2,
        required=False,
    )
    item_origprice = forms.DecimalField(
        decimal_places=2,
        required=False,
    )

    def get_status_choice_list():
        return [
            'Ready4donation', 'Ready4sale', 'Ready4recycling', 'Donated',
            'Up4sale', 'Ready2ship', 'Shipped', 'Recycled', 'Treatment',
            'Returned', 'Lost', 'Sent2realreal', 'Soldonrealreal',
            'Soldonbuffxchange', 'Sent2consignment', 'Sent2revolve'
        ]

    item_status = autocomplete.Select2ListCreateChoiceField(
        choice_list=get_status_choice_list,
        widget=autocomplete.ListSelect2(url='status-autocomplete'))

    def get_customer_status_choice_list():
        return [
            'Ready for donation', 'Ready for sale', 'Ready for recycling',
            'Donated', 'Up for sale', 'Ready to ship', 'Shipped', 'Recycled',
            'Treatment'
        ]

    customerfacingstatus = autocomplete.Select2ListCreateChoiceField(
        label='Customer Facing Status',
        choice_list=get_customer_status_choice_list,
        widget=autocomplete.ListSelect2(url='customerstatus-autocomplete'))

    item_statuschangedate = forms.DateField(label='Status Changed',
                                            initial=datetime.date.today)
    item_location = forms.CharField(required=False, )

    def get_mktplace_choice_list():
        return ['Up', 'Down', 'Sold', 'Returned']

    ebay = autocomplete.Select2ListChoiceField(
        choice_list=get_mktplace_choice_list,
        widget=autocomplete.ListSelect2(url='mktplace-autocomplete'),
        required=False,
    )
    poshmark = autocomplete.Select2ListChoiceField(
        choice_list=get_mktplace_choice_list,
        widget=autocomplete.ListSelect2(url='mktplace-autocomplete'),
        required=False,
    )
    vinted = autocomplete.Select2ListChoiceField(
        choice_list=get_mktplace_choice_list,
        widget=autocomplete.ListSelect2(url='mktplace-autocomplete'),
        required=False,
    )
    tradesy = autocomplete.Select2ListChoiceField(
        choice_list=get_mktplace_choice_list,
        widget=autocomplete.ListSelect2(url='mktplace-autocomplete'),
        required=False,
    )
    craigslist = autocomplete.Select2ListChoiceField(
        choice_list=get_mktplace_choice_list,
        widget=autocomplete.ListSelect2(url='mktplace-autocomplete'),
        required=False,
    )
    letgo = autocomplete.Select2ListChoiceField(
        choice_list=get_mktplace_choice_list,
        widget=autocomplete.ListSelect2(url='mktplace-autocomplete'),
        required=False,
    )
    offerup = autocomplete.Select2ListChoiceField(
        choice_list=get_mktplace_choice_list,
        widget=autocomplete.ListSelect2(url='mktplace-autocomplete'),
        required=False,
    )
    offline = forms.ChoiceField(
        choices=[('', None), (1, 'Sold')],
        required=False,
    )

    def clean(self):
        cleaned_data = self.cleaned_data
        item_category = cleaned_data.get("item_category")
        db_value = Category.objects.get(category=item_category).category

        # if  db_value=='Clothes' or db_value=='Shoes' or db_value=='Accessories':
        #     # Keep the database consistent. The user may have
        #     # submitted a shipping_destination even if shipping
        #     # was not selected
        #     #self.cleaned_data['item_brand'] = ''
        #     if not cleaned_data['item_brand'] or not cleaned_data['item_size'] or not cleaned_data['item_color']:
        #         raise forms.ValidationError("'item_brand', 'item_size', and 'item_color' are required.")
        # else:
        #     cleaned_data['item_brand'] = ''
        #     cleaned_data['item_size'] = ''
        #     cleaned_data['item_color'] = ''

        if not cleaned_data['item_type']:
            if db_value == 'Clothes' or db_value == 'Shoes' or db_value == 'Accessories' or db_value == 'Electronics' or db_value == 'Toys' or db_value == 'Home' or db_value == 'SportsGear' or db_value == 'Cosmetics':
                raise forms.ValidationError("'item_type' is required.")

    #   if not cleaned_data['item_brand']:
    #       if  db_value=='Clothes' or db_value=='Shoes' or db_value=='Accessories' or db_value=='Electronics' or db_value=='Toys' or db_value=='Home' or db_value=='SportsGear' or db_value=='Cosmetics':
    #            raise forms.ValidationError("'item_brand' is required.")

        if not cleaned_data['item_size']:
            if db_value == 'Clothes' or db_value == 'Shoes':
                raise forms.ValidationError("'item_size' is required.")

    #  item_color=cleaned_data.get('item_color')
    #  item_color1=cleaned_data['item_color']
    #  color = Color.objects.get(color=item_color1).color

    #if not cleaned_data['colors']:
    #      if  db_value=='Clothes' or db_value=='Shoes':
    #          raise forms.ValidationError("'item_color' is required.")

    #item_id = cleaned_data.get('id')
    #item_status = cleaned_data.get('item_status')
    #item_status_val = Inventoryitem.objects.get(id=item_id).item_status
    #poshmark = cleaned_data.get('poshmark')
    #ebay =cleaned_data.get('ebay')
    #vinted =cleaned_data.get('vinted')
    #tradesy =cleaned_data.get('tradesy')
    #craigslist =cleaned_data.get('craigslist')
    #offerup =cleaned_data.get('offerup')
    #letgo =cleaned_data.get('letgo')

    #   if item_status_val=='Shipped':
    #       if (poshmark=='up' or ebay=='up' or vinted=='up' or tradesy=='up' or craigslist=='up' or offerup=='up' or letgo=='up') :
    #           raise ValidationError("cant change status for shipping when 'Up' on one of the platforms")

        return self.cleaned_data

    def __init__(self, *args, **kwargs):
        #   self.id = kwargs.pop('id')
        super(InventoryitemForm, self).__init__(auto_id=True, *args, **kwargs)