示例#1
0
 class Meta:
     model = RecurringInvoice
     fields = (
         "contact",
         "customer",
         "title",
         "description",
         "owned_by",
         "postal_address",
         "starts_on",
         "ends_on",
         "periodicity",
         "create_invoice_on_day",
         "next_period_starts_on",
         "subtotal",
         "third_party_costs",
         "discount",
         "liable_to_vat",
         "create_project",
     )
     widgets = {
         "customer": Autocomplete(model=Organization),
         "contact": Autocomplete(model=Person,
                                 params={"only_employees": "on"}),
         "description": Textarea,
         "postal_address": Textarea,
         "periodicity": forms.RadioSelect,
     }
示例#2
0
 class Meta:
     model = Invoice
     fields = (
         "contact",
         "customer",
         "invoiced_on",
         "due_on",
         "title",
         "description",
         "service_period_from",
         "service_period_until",
         "owned_by",
         "status",
         "closed_on",
         "payment_notice",
         "postal_address",
         "type",
         "subtotal",
         "third_party_costs",
         "discount",
         "liable_to_vat",
         "show_service_details",
     )
     widgets = {
         "customer": Autocomplete(model=Organization),
         "contact": Autocomplete(model=Person,
                                 params={"only_employees": "on"}),
         "status": forms.RadioSelect,
         "description": Textarea,
         "payment_notice": Textarea({"rows": 2}),
         "postal_address": Textarea,
         "type": forms.RadioSelect,
     }
示例#3
0
class PlannedWorkSearchForm(Form):
    project = forms.ModelChoiceField(
        queryset=Project.objects.all(),
        required=False,
        widget=Autocomplete(model=Project),
        label="",
    )
    user = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["user"].choices = User.objects.choices(
            collapse_inactive=True, myself=True
        )

    def filter(self, queryset):
        data = self.cleaned_data
        if data.get("project"):
            queryset = queryset.filter(project=data.get("project"))
        queryset = self.apply_owned_by(queryset, attribute="user")
        return queryset.select_related(
            "user",
            "project__owned_by",
            "project__customer",
            "project__contact__organization",
        )
示例#4
0
class LoggedMoveForm(ModelForm):
    service = forms.ModelChoiceField(
        queryset=Service.objects.logging().filter(
            project__closed_on__isnull=True),
        widget=Autocomplete(model=Service),
        label="",
        initial="",
    )

    def __init__(self, *args, **kwargs):
        kwargs.setdefault("initial", {}).setdefault("service", "")
        super().__init__(*args, **kwargs)

        if self.instance.archived_at:
            self.move_forbidden = _("Cannot move archived logbook entries.")
        elif self.instance.service.project.closed_on:
            self.move_forbidden = _(
                "Cannot move logbook entries of closed projects.")
        else:
            self.move_forbidden = False
        if self.move_forbidden:
            messages.error(self.request, self.move_forbidden)

    def clean(self):
        data = super().clean()
        if self.move_forbidden:
            self.add_error("__all__", self.move_forbidden)
        return data
示例#5
0
 class Meta:
     model = Deal
     fields = (
         "contact",
         "customer",
         "title",
         "description",
         "probability",
         "decision_expected_on",
         "owned_by",
     )
     widgets = {
         "customer": Autocomplete(model=Organization),
         "contact": Autocomplete(model=Person,
                                 params={"only_employees": "on"}),
         "probability": forms.RadioSelect,
         "description": Textarea,
     }
示例#6
0
class OfferSearchForm(Form):
    q = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": _("Search")
        }),
        label="",
    )
    s = forms.ChoiceField(
        choices=(
            ("all", _("All states")),
            ("", _("Open")),
            (_("Exact"), Offer.STATUS_CHOICES),
        ),
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    org = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )
    owned_by = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["owned_by"].choices = User.objects.choices(
            collapse_inactive=True, myself=True)

    def filter(self, queryset):
        data = self.cleaned_data
        queryset = queryset.search(data.get("q"))
        if data.get("s") == "all":
            pass
        elif data.get("s"):
            queryset = queryset.filter(status=data.get("s"))
        else:
            queryset = queryset.filter(status__lte=Offer.OFFERED)
        queryset = self.apply_renamed(queryset, "org", "project__customer")
        queryset = self.apply_owned_by(queryset)
        return queryset.select_related(
            "owned_by",
            "project__owned_by",
            "project__customer",
            "project__contact__organization",
        )
示例#7
0
 class Meta:
     model = CreditEntry
     fields = [
         "ledger",
         "reference_number",
         "value_date",
         "total",
         "payment_notice",
         "invoice",
         "notes",
     ]
     widgets = {"invoice": Autocomplete(model=Invoice), "notes": Textarea}
示例#8
0
 class Meta:
     model = Campaign
     fields = (
         "customer",
         "title",
         "description",
         "owned_by",
     )
     widgets = {
         "customer": Autocomplete(model=Organization),
         "description": Textarea,
     }
示例#9
0
 class Meta:
     model = Project
     fields = (
         "contact",
         "customer",
         "title",
         "description",
         "campaign",
         "cost_center",
         "owned_by",
         "type",
         "flat_rate",
         "closed_on",
     )
     widgets = {
         "customer": Autocomplete(model=Organization),
         "contact": Autocomplete(model=Person, params={"only_employees": "on"}),
         "campaign": Autocomplete(model=Campaign),
         "description": Textarea,
         "type": forms.RadioSelect,
     }
示例#10
0
 class Meta:
     model = ExternalWork
     fields = (
         "provided_by",
         "title",
         "service_type",
         "notes",
         "milestone",
     )
     widgets = {
         "provided_by": Autocomplete(model=Organization),
         "notes": Textarea,
     }
示例#11
0
class ProjectAutocompleteForm(forms.Form):
    project = forms.ModelChoiceField(
        queryset=Project.objects.all(),
        widget=Autocomplete(model=Project, params={"only_open": "on"}),
        label="",
        required=False,
    )
    service = forms.ModelChoiceField(
        queryset=Service.objects.all(),
        widget=Autocomplete(model=Service),
        label="",
        required=False,
    )

    def clean(self):
        data = super().clean()
        if data["service"]:
            data["project"] = data["service"].project
            return data
        elif data["project"]:
            return data
        self.add_error("project", _("This field is required."))
        return data
示例#12
0
 class Meta:
     model = Invoice
     fields = (
         "contact",
         "customer",
         "invoiced_on",
         "due_on",
         "title",
         "description",
         "owned_by",
         "postal_address",
         "subtotal",
         "third_party_costs",
         "discount",
         "liable_to_vat",
     )
     widgets = {
         "customer": Autocomplete(model=Organization),
         "contact": Autocomplete(model=Person,
                                 params={"only_employees": "on"}),
         "description": Textarea,
         "postal_address": Textarea,
     }
示例#13
0
class ExternalWorkSearchForm(Form):
    project = forms.ModelChoiceField(
        queryset=Project.objects.all(),
        required=False,
        widget=Autocomplete(model=Project),
        label="",
    )
    provided_by = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )

    def filter(self, queryset):
        data = self.cleaned_data
        if data.get("project"):
            queryset = queryset.filter(project=data.get("project"))
        return queryset.select_related(
            "provided_by",
            "project__owned_by",
            "project__customer",
            "project__contact__organization",
        )
示例#14
0
class CampaignSearchForm(Form):
    q = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": _("Search")
        }),
        label="",
    )
    s = forms.ChoiceField(
        choices=[
            ("", _("All")),
            (capfirst(_("status")), [("open", _("Open")),
                                     ("closed", _("Closed"))]),
        ],
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    org = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )
    owned_by = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["owned_by"].choices = User.objects.choices(
            collapse_inactive=True, myself=True)

    def filter(self, queryset):
        data = self.cleaned_data
        queryset = queryset.search(data.get("q"))
        if data.get("s") == "open":
            queryset = queryset.open()
        elif data.get("s") == "closed":
            queryset = queryset.closed()
        queryset = self.apply_renamed(queryset, "org", "customer")
        queryset = self.apply_simple(queryset, "type")
        queryset = self.apply_owned_by(queryset)
        return queryset.select_related("customer", "owned_by")
示例#15
0
class RecurringInvoiceSearchForm(Form):
    q = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": _("Search")
        }),
        label="",
    )
    s = forms.ChoiceField(
        choices=(("all", _("All states")), ("", _("Open")), ("closed",
                                                             _("Closed"))),
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    org = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )
    owned_by = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["owned_by"].choices = User.objects.choices(
            collapse_inactive=True, myself=True)

    def filter(self, queryset):
        data = self.cleaned_data
        queryset = queryset.search(data.get("q"))
        if data.get("s") == "":
            queryset = queryset.filter(
                Q(ends_on__isnull=True) | Q(ends_on__gte=dt.date.today()))
        elif data.get("s") == "closed":
            queryset = queryset.filter(
                Q(ends_on__isnull=False) & Q(ends_on__lt=dt.date.today()))
        queryset = self.apply_renamed(queryset, "org", "customer")
        queryset = self.apply_owned_by(queryset)
        return queryset.select_related("customer", "contact__organization",
                                       "owned_by")
示例#16
0
class OfferCopyForm(Form):
    project = forms.ModelChoiceField(
        queryset=Project.objects.all(),
        widget=Autocomplete(model=Project, params={"only_open": "on"}),
        label="",
    )

    def __init__(self, *args, **kwargs):
        self.project = kwargs.pop("project")
        super().__init__(*args, **kwargs)

    def clean_project(self):
        project = self.cleaned_data.get("project")
        if project == self.project:
            self.add_warning(
                _("Same project selected as offer already belongs to."),
                code="same-project",
            )
        return project
示例#17
0
 class Meta:
     model = Person
     fields = (
         "address",
         "given_name",
         "family_name",
         "address_on_first_name_terms",
         "salutation",
         "date_of_birth",
         "notes",
         "organization",
         "primary_contact",
         "groups",
         "is_archived",
     )
     widgets = {
         "notes": Textarea(),
         "organization": Autocomplete(model=Organization),
         "groups": forms.CheckboxSelectMultiple(),
     }
示例#18
0
 def __init__(self, *args, **kwargs):
     super().__init__(*args, **kwargs)
     collector = SlowCollector(using=self.instance._state.db)
     try:
         collector.collect([self.instance])
     except ProtectedError:
         self.fields["substitute_with"] = forms.ModelChoiceField(
             Organization.objects.exclude(pk=self.instance.pk),
             widget=Autocomplete(model=Organization),
             label=_("substitute with"),
         )
         if self.request.method == "GET":
             messages.info(
                 self.request,
                 _("This organization has related objects. It is"
                   " therefore not possible to delete it, but you"
                   " may reassign the related objects to a different"
                   " organization."
                   " Alternatively, you can also archive the organization."
                   ),
             )
示例#19
0
class LoggedHoursSearchForm(Form):
    q = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": _("Search")
        }),
        label="",
    )
    rendered_by = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    project = forms.ModelChoiceField(
        queryset=Project.objects.all(),
        required=False,
        widget=Autocomplete(model=Project),
        label="",
    )
    organization = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )
    date_from = forms.DateField(widget=DateInput, required=False, label="")
    date_until = forms.DateField(widget=DateInput,
                                 required=False,
                                 label=mark_safe("– "))
    service = forms.ModelChoiceField(
        queryset=Service.objects.all(),
        required=False,
        widget=forms.HiddenInput,
        label="",
    )
    campaign = forms.ModelChoiceField(
        queryset=Campaign.objects.all(),
        required=False,
        widget=forms.HiddenInput,
        label="",
    )
    offer = forms.IntegerField(required=False,
                               widget=forms.HiddenInput,
                               label="")
    circle = forms.IntegerField(required=False,
                                widget=forms.HiddenInput,
                                label="")
    role = forms.ModelChoiceField(queryset=Role.objects.all(),
                                  required=False,
                                  widget=forms.HiddenInput,
                                  label="")
    category = forms.CharField(required=False,
                               widget=forms.HiddenInput,
                               label="")
    not_archived = forms.BooleanField(required=False,
                                      widget=forms.HiddenInput,
                                      label="")

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["rendered_by"].choices = User.objects.choices(
            collapse_inactive=False, myself=True)

    def filter(self, queryset):
        data = self.cleaned_data
        queryset = queryset.search(data.get("q"))
        if data.get("rendered_by") == -1:
            queryset = queryset.filter(rendered_by=self.request.user)
        elif data.get("rendered_by"):
            queryset = queryset.filter(rendered_by=data.get("rendered_by"))
        if data.get("project"):
            queryset = queryset.filter(service__project=data.get("project"))
        if data.get("organization"):
            queryset = queryset.filter(
                service__project__customer=data.get("organization"))
        if data.get("date_from"):
            queryset = queryset.filter(rendered_on__gte=data.get("date_from"))
        if data.get("date_until"):
            queryset = queryset.filter(rendered_on__lte=data.get("date_until"))

        # "hidden" filters
        self.hidden_filters = []
        if data.get("service"):
            service = data.get("service")
            self.hidden_filters.append((
                f"{capfirst(service._meta.verbose_name)}: {service}",
                querystring(self.request.GET, service=""),
            ), )
            queryset = queryset.filter(service=service)
        if data.get("campaign"):
            campaign = data.get("campaign")
            self.hidden_filters.append((
                f"{capfirst(campaign._meta.verbose_name)}: {campaign}",
                querystring(self.request.GET, campaign=""),
            ), )
            queryset = queryset.filter(service__project__campaign=campaign)
        if data.get("offer") == 0:
            self.hidden_filters.append(
                (_("No offer"), querystring(self.request.GET, offer="")))
            queryset = queryset.filter(service__offer__isnull=True)
        elif data.get("offer"):
            offer = Offer.objects.filter(pk=data.get("offer")).first()
            self.hidden_filters.append((
                f"{capfirst(Offer._meta.verbose_name)}: {offer}",
                querystring(self.request.GET, offer=""),
            ), )
            queryset = queryset.filter(service__offer=offer)
        if data.get("circle") == 0:
            queryset = queryset.filter(service__role__isnull=True)
            self.hidden_filters.append(
                (_("No circle"), querystring(self.request.GET, circle="")))
        elif data.get("circle"):
            circle = Circle.objects.filter(pk=data.get("circle")).first()
            self.hidden_filters.append((
                f"{capfirst(Circle._meta.verbose_name)}: {circle}",
                querystring(self.request.GET, circle=""),
            ), )
            queryset = queryset.filter(service__role__circle=circle)
        if data.get("role"):
            role = data.get("role")
            self.hidden_filters.append((
                f"{capfirst(role._meta.verbose_name)}: {role}",
                querystring(self.request.GET, role=""),
            ), )
            queryset = queryset.filter(service__role=role)
        if data.get("category") == "none":
            self.hidden_filters.append((
                f"{capfirst(_('category'))}: {_('Undefined')}",
                querystring(self.request.GET, category=""),
            ), )
            queryset = queryset.filter(
                Q(service__role__isnull=True)
                | Q(service__role__work_category=""))

        elif category := data.get("category"):
            self.hidden_filters.append((
                f"{capfirst(_('category'))}: {category}",
                querystring(self.request.GET, category=""),
            ), )
            queryset = queryset.filter(service__role__work_category=category)
        if data.get("not_archived"):
            self.hidden_filters.append((_("Not archived"),
                                        querystring(self.request.GET,
                                                    not_archived="")))
            queryset = queryset.filter(archived_at__isnull=True)

        return queryset.select_related("service__project__owned_by",
                                       "rendered_by")
示例#20
0
class LoggedCostSearchForm(Form):
    q = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": _("Search")
        }),
        label="",
    )
    rendered_by = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    project = forms.ModelChoiceField(
        queryset=Project.objects.all(),
        required=False,
        widget=Autocomplete(model=Project),
        label="",
    )
    organization = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )
    expenses = forms.BooleanField(required=False, label=_("expenses"))
    date_from = forms.DateField(widget=DateInput, required=False, label="")
    date_until = forms.DateField(widget=DateInput,
                                 required=False,
                                 label=mark_safe("– "))
    service = forms.ModelChoiceField(
        queryset=Service.objects.all(),
        required=False,
        widget=forms.HiddenInput,
        label="",
    )
    campaign = forms.ModelChoiceField(
        queryset=Campaign.objects.all(),
        required=False,
        widget=forms.HiddenInput,
        label="",
    )
    offer = forms.IntegerField(required=False,
                               widget=forms.HiddenInput,
                               label="")
    not_archived = forms.BooleanField(required=False,
                                      widget=forms.HiddenInput,
                                      label="")

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["rendered_by"].choices = User.objects.choices(
            collapse_inactive=False, myself=True)

        if not self.request.user.features[FEATURES.EXPENSES]:
            self.fields.pop("expenses")

    def filter(self, queryset):
        data = self.cleaned_data
        queryset = queryset.search(data.get("q"))
        if data.get("rendered_by") == -1:
            queryset = queryset.filter(rendered_by=self.request.user)
        elif data.get("rendered_by"):
            queryset = queryset.filter(rendered_by=data.get("rendered_by"))
        if data.get("project"):
            queryset = queryset.filter(service__project=data.get("project"))
        if data.get("organization"):
            queryset = queryset.filter(
                service__project__customer=data.get("organization"))
        if data.get("expenses"):
            queryset = queryset.filter(are_expenses=True)
        if data.get("date_from"):
            queryset = queryset.filter(rendered_on__gte=data.get("date_from"))
        if data.get("date_until"):
            queryset = queryset.filter(rendered_on__lte=data.get("date_until"))

        # "hidden" filters
        self.hidden_filters = []
        if data.get("service"):
            service = data.get("service")
            self.hidden_filters.append((
                f"{capfirst(service._meta.verbose_name)}: {service}",
                querystring(self.request.GET, service=""),
            ), )
            queryset = queryset.filter(service=service)
        if data.get("campaign"):
            campaign = data.get("campaign")
            self.hidden_filters.append((
                f"{capfirst(campaign._meta.verbose_name)}: {campaign}",
                querystring(self.request.GET, campaign=""),
            ), )
            queryset = queryset.filter(service__project__campaign=campaign)
        if data.get("offer") == 0:
            self.hidden_filters.append(
                (_("No offer"), querystring(self.request.GET, offer="")))
            queryset = queryset.filter(service__offer__isnull=True)
        elif data.get("offer"):
            offer = Offer.objects.filter(pk=data.get("offer")).first()
            self.hidden_filters.append((
                f"{capfirst(Offer._meta.verbose_name)}: {offer}",
                querystring(self.request.GET, offer=""),
            ), )
            queryset = queryset.filter(service__offer=offer)
        if data.get("not_archived"):
            self.hidden_filters.append((_("Not archived"),
                                        querystring(self.request.GET,
                                                    not_archived="")))
            queryset = queryset.filter(archived_at__isnull=True)

        return queryset.select_related("service__project__owned_by",
                                       "rendered_by")

    def response(self, request, queryset):
        if (request.GET.get("export") == "xlsx"
                and request.user.features[FEATURES.CONTROLLING]):
            xlsx = WorkbenchXLSXDocument()
            xlsx.logged_costs(queryset)
            return xlsx.to_response("costs.xlsx")
示例#21
0
class OfferAutocompleteForm(forms.Form):
    offer = forms.ModelChoiceField(
        queryset=Offer.objects.all(),
        widget=Autocomplete(model=Offer),
        label="",
    )
示例#22
0
class ProjectSearchForm(Form):
    q = forms.CharField(
        required=False,
        widget=forms.TextInput(
            attrs={"class": "form-control", "placeholder": _("Search")}
        ),
        label="",
    )
    s = forms.ChoiceField(
        choices=[
            ("all", _("All")),
            (capfirst(_("status")), [("", _("Open")), ("closed", _("Closed"))]),
            (
                _("Defined search"),
                [
                    ("no-invoices", _("No invoices")),
                    ("accepted-offers", _("Accepted offers")),
                    (
                        "accepted-offers-no-invoices",
                        _("Accepted offers but no invoices"),
                    ),
                    ("solely-declined-offers", _("Solely declined offers")),
                    ("old-projects", _("Old projects (60 days inactivity)")),
                    (
                        "invalid-customer-contact-combination",
                        _("Invalid customer/contact combination"),
                    ),
                ],
            ),
        ],
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    org = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )
    type = forms.ChoiceField(
        choices=[("", _("All types"))] + Project.TYPE_CHOICES,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    owned_by = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["owned_by"].choices = User.objects.choices(
            collapse_inactive=True, myself=True
        )

    def filter(self, queryset):
        data = self.cleaned_data
        queryset = queryset.search(data.get("q"))
        if data.get("s") == "":
            queryset = queryset.open()
        elif data.get("s") == "closed":
            queryset = queryset.closed()
        elif data.get("s") == "no-invoices":
            queryset = queryset.orders().without_invoices()
        elif data.get("s") == "accepted-offers":
            queryset = queryset.with_accepted_offers()
        elif data.get("s") == "accepted-offers-no-invoices":
            queryset = queryset.with_accepted_offers().without_invoices()
        elif data.get("s") == "solely-declined-offers":
            queryset = queryset.solely_declined_offers()
        elif data.get("s") == "old-projects":
            queryset = queryset.old_projects()
        elif data.get("s") == "invalid-customer-contact-combination":
            queryset = queryset.invalid_customer_contact_combination()
        queryset = self.apply_renamed(queryset, "org", "customer")
        queryset = self.apply_simple(queryset, "type")
        queryset = self.apply_owned_by(queryset)
        return queryset.select_related("customer", "contact__organization", "owned_by")
示例#23
0
 class Meta:
     model = Project
     fields = ["customer"]
     widgets = {"customer": Autocomplete(model=Organization)}
示例#24
0
class DealSearchForm(Form):
    q = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": _("Search")
        }),
        label="",
    )
    s = forms.ChoiceField(
        choices=(
            ("all", _("All states")),
            ("", _("Open")),
            (
                _("Closed"),
                [
                    row for row in Deal.STATUS_CHOICES
                    if not row[0] == Deal.OPEN
                ],
            ),
        ),
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    org = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )
    owned_by = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["owned_by"].choices = User.objects.choices(
            collapse_inactive=True, myself=True)

    def filter(self, queryset):
        data = self.cleaned_data
        queryset = queryset.search(data.get("q"))
        self.should_group_deals = False
        if data.get("s") == "":
            queryset = queryset.filter(status=Deal.OPEN).order_by(
                "-probability", "status", "decision_expected_on", "id")
            self.should_group_deals = True
        elif data.get("s") != "all":
            queryset = queryset.filter(status=data.get("s")).order_by(
                "-closed_on", "-pk")
        queryset = self.apply_renamed(queryset, "org", "customer")
        queryset = self.apply_owned_by(queryset)
        return queryset.select_related("owned_by", "customer",
                                       "contact__organization")

    def response(self, request, queryset):
        if request.GET.get("export") == "xlsx":
            xlsx = WorkbenchXLSXDocument()
            additional = []
            values = {(v.deal_id, v.type_id): v.value
                      for v in Value.objects.filter(deal__in=queryset)}
            attributes = {(a.deal_id, a.attribute.group_id): a.attribute
                          for a in DealAttribute.objects.filter(
                              deal__in=queryset).select_related("attribute")}

            for vt in ValueType.objects.all():
                additional.append((
                    "{}: {}".format(Value._meta.verbose_name, vt),
                    (lambda id: lambda deal: values.get((deal.id, id)))(vt.id),
                ))
            for ag in AttributeGroup.objects.all():
                additional.append((
                    "{}: {}".format(Attribute._meta.verbose_name, ag),
                    (lambda id: lambda deal: attributes.get(
                        (deal.id, id)))(ag.id),
                ))
            xlsx.table_from_queryset(queryset, additional=additional)
            return xlsx.to_response("deals.xlsx")
示例#25
0
 class Meta:
     model = Service
     fields = ["project"]
     widgets = {"project": Autocomplete(model=Project, params={"only_open": "on"})}
示例#26
0
class InvoiceSearchForm(Form):
    q = forms.CharField(
        required=False,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": _("Search")
        }),
        label="",
    )
    s = forms.ChoiceField(
        choices=(
            ("", _("All states")),
            ("open", _("Open")),
            (_("Exact"), Invoice.STATUS_CHOICES),
        ),
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )
    org = forms.ModelChoiceField(
        queryset=Organization.objects.all(),
        required=False,
        widget=Autocomplete(model=Organization),
        label="",
    )
    owned_by = forms.TypedChoiceField(
        coerce=int,
        required=False,
        widget=forms.Select(attrs={"class": "custom-select"}),
        label="",
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["owned_by"].choices = User.objects.choices(
            collapse_inactive=True, myself=True)

    def filter(self, queryset):
        data = self.cleaned_data
        queryset = queryset.search(data.get("q"))
        if data.get("s") == "open":
            queryset = queryset.open()
        elif data.get("s"):
            queryset = queryset.filter(status=data.get("s"))
        queryset = self.apply_renamed(queryset, "org", "customer")
        queryset = self.apply_owned_by(queryset)
        return queryset.select_related("customer", "contact__organization",
                                       "owned_by", "project__owned_by")

    def response(self, request, queryset):
        if request.GET.get("export") == "pdf":
            if not queryset.exists():
                messages.warning(request, _("No invoices found."))
                return HttpResponseRedirect("?error=1")

            count = queryset.count()
            if count > settings.BATCH_MAX_ITEMS:
                messages.error(
                    request,
                    _("%s invoices in selection, that's too many.") % count)
                return HttpResponseRedirect("?error=1")

            pdf, response = pdf_response(
                "invoices",
                as_attachment=request.GET.get("disposition") == "attachment",
            )
            for invoice in queryset:
                pdf.init_letter()
                pdf.process_invoice(invoice)
                pdf.restart()
            pdf.generate()
            return response

        if request.GET.get("export") == "xlsx":
            xlsx = WorkbenchXLSXDocument()
            xlsx.table_from_queryset(queryset)
            return xlsx.to_response("invoices.xlsx")
示例#27
0
class PersonAutocompleteForm(forms.Form):
    person = forms.ModelChoiceField(queryset=Person.objects.all(),
                                    widget=Autocomplete(model=Person),
                                    label="")