class ItemList(GridReport): title = _("items") basequeryset = Item.objects.all() model = Item frozenColumns = 1 editable = True help_url = "modeling-wizard/master-data/items.html" message_when_empty = Template(""" <h3>Define items</h3> <br> A basic piece of master data is the list of items to plan.<br> End products, intermediate products and raw materials all need to be defined.<br> <br><br> <div role="group" class="btn-group.btn-group-justified"> <a href="{{request.prefix}}/data/input/item/add/" class="btn btn-primary">Create a single item<br>in a form</a> <a href="{{request.prefix}}/wizard/load/production/?currentstep=1" class="btn btn-primary">Wizard to upload items<br>from a spreadsheet</a> </div> <br> """) rows = ( GridFieldHierarchicalText( "name", title=_("name"), key=True, formatter="detail", extra='"role":"input/item"', model=Item, ), GridFieldText("description", title=_("description")), GridFieldText("category", title=_("category"), initially_hidden=True), GridFieldText("subcategory", title=_("subcategory"), initially_hidden=True), GridFieldText( "owner", title=_("owner"), field_name="owner__name", formatter="detail", extra='"role":"input/item"', ), GridFieldCurrency("cost", title=_("cost")), GridFieldNumber("weight", title=_("weight"), initially_hidden=True), GridFieldNumber("volume", title=_("volume"), initially_hidden=True), GridFieldText("uom", title=_("unit of measure"), initially_hidden=True), GridFieldInteger("periodofcover", title=_("period of cover"), initially_hidden=True), GridFieldChoice("type", title=_("type"), choices=Item.types, initially_hidden=True), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), )
class ResourceSkillList(GridReport): title = _("resource skills") basequeryset = ResourceSkill.objects.all() model = ResourceSkill frozenColumns = 1 help_url = "model-reference/resource-skills.html" message_when_empty = Template(""" <h3>Define resource skills</h3> <br> The table defines all skills a resource has.<br> <br><br> <div role="group" class="btn-group.btn-group-justified"> <a href="{{request.prefix}}/data/input/resourceskill/add/" class="btn btn-primary">Create a resource skill</a> </div> <br> """) rows = ( GridFieldInteger( "id", title=_("identifier"), key=True, formatter="detail", extra='"role":"input/resourceskill"', ), GridFieldHierarchicalText( "resource", title=_("resource"), field_name="resource__name", formatter="detail", extra='"role":"input/resource"', model=Resource, ), GridFieldText( "skill", title=_("skill"), field_name="skill__name", formatter="detail", extra='"role":"input/skill"', ), GridFieldDateTime("effective_start", title=_("effective start"), initially_hidden=True), GridFieldDateTime("effective_end", title=_("effective end"), initially_hidden=True), GridFieldInteger("priority", title=_("priority"), initially_hidden=True), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), )
class LocationList(GridReport): title = _("locations") basequeryset = Location.objects.all() model = Location frozenColumns = 1 help_url = "modeling-wizard/master-data/locations.html" message_when_empty = Template(""" <h3>Define locations</h3> <br> A basic piece of master data is the list of locations where production is happening or inventory is kept.<br> <br><br> <div role="group" class="btn-group.btn-group-justified"> <a href="{{request.prefix}}/data/input/location/add/" class="btn btn-primary">Create a single location<br>in a form</a> <a href="{{request.prefix}}/wizard/load/production/?currentstep=1" class="btn btn-primary">Wizard to upload locations<br>from a spreadsheet</a> </div> <br> """) rows = ( GridFieldHierarchicalText( "name", title=_("name"), key=True, formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldText("description", title=_("description")), GridFieldText("category", title=_("category"), initially_hidden=True), GridFieldText("subcategory", title=_("subcategory"), initially_hidden=True), GridFieldText( "available", title=_("available"), field_name="available__name", formatter="detail", extra='"role":"input/calendar"', ), GridFieldText( "owner", title=_("owner"), field_name="owner__name", formatter="detail", extra='"role":"input/location"', ), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), )
class CustomerList(GridReport): title = _("customers") basequeryset = Customer.objects.all() model = Customer frozenColumns = 1 help_url = "modeling-wizard/master-data/customers.html" message_when_empty = Template(""" <h3>Define customers</h3> <br> A basic piece of master data is the customers buying items from us.<br> <br><br> <div role="group" class="btn-group.btn-group-justified"> <a href="{{request.prefix}}/data/input/customer/add/" class="btn btn-primary">Create a single customer<br> in a form</a> <a href="{{request.prefix}}/wizard/load/production/?currentstep=1" class="btn btn-primary">Wizard to upload customers<br>from a spreadsheet</a> </div> <br> """) rows = ( GridFieldHierarchicalText( "name", title=_("name"), key=True, formatter="detail", extra='"role":"input/customer"', model=Customer, ), GridFieldText("description", title=_("description")), GridFieldText("category", title=_("category"), initially_hidden=True), GridFieldText("subcategory", title=_("subcategory"), initially_hidden=True), GridFieldText( "owner", title=_("owner"), field_name="owner__name", formatter="detail", extra='"role":"input/customer"', ), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), )
class ResourceSkillList(GridReport): title = _("resource skills") basequeryset = ResourceSkill.objects.all() model = ResourceSkill frozenColumns = 1 help_url = "model-reference/resource-skills.html" rows = ( GridFieldInteger( "id", title=_("identifier"), key=True, formatter="detail", extra='"role":"input/resourceskill"', ), GridFieldHierarchicalText( "resource", title=_("resource"), field_name="resource__name", formatter="detail", extra='"role":"input/resource"', model=Resource, ), GridFieldText( "skill", title=_("skill"), field_name="skill__name", formatter="detail", extra='"role":"input/skill"', ), GridFieldDateTime("effective_start", title=_("effective start"), initially_hidden=True), GridFieldDateTime("effective_end", title=_("effective end"), initially_hidden=True), GridFieldInteger("priority", title=_("priority"), initially_hidden=True), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), )
class DemandList(GridReport): template = "input/demand.html" title = _("sales orders") model = Demand frozenColumns = 1 help_url = "modeling-wizard/master-data/sales-orders.html" message_when_empty = Template(""" <h3>Define sales orders</h3> <br> The sales orders table contains all the orders placed by your customers.<br><br> Orders in the status "open" are still be delivered and will be planned.<br><br> <br><br> <div role="group" class="btn-group.btn-group-justified"> <a href="{{request.prefix}}/data/input/demand/add/" class="btn btn-primary">Create a single sales order<br>in a form</a> <a href="{{request.prefix}}/wizard/load/production/?currentstep=2" class="btn btn-primary">Wizard to upload sale orders<br>from a spreadsheet</a> </div> <br> """) @classmethod def initialize(reportclass, request): if reportclass._attributes_added != 2: reportclass._attributes_added = 2 reportclass.attr_sql = "" # Adding custom item attributes for f in getAttributeFields(Item, related_name_prefix="item", initially_hidden=True): reportclass.rows += (f, ) reportclass.attr_sql += "item.%s, " % f.name.split("__")[-1] # Adding custom location attributes for f in getAttributeFields(Location, related_name_prefix="location", initially_hidden=True): reportclass.rows += (f, ) reportclass.attr_sql += "location.%s, " % f.name.split( "__")[-1] # Adding custom customer attributes for f in getAttributeFields(Customer, related_name_prefix="customer", initially_hidden=True): reportclass.rows += (f, ) reportclass.attr_sql += "customer.%s, " % f.name.split( "__")[-1] # Adding custom demand attributes for f in getAttributeFields(Demand, initially_hidden=True): reportclass.rows += (f, ) reportclass.attr_sql += "demand.%s, " % f.name.split("__")[-1] @classmethod def basequeryset(reportclass, request, *args, **kwargs): q = Demand.objects.all() if "item" in request.GET: item = Item.objects.using( request.database).get(name__exact=unquote(request.GET["item"])) q = q.filter(item__lft__gte=item.lft, item__lft__lt=item.rght) if "location" in request.GET: location = Location.objects.using(request.database).get( name__exact=unquote(request.GET["location"])) q = q.filter(location__lft__gte=location.lft, location__lft__lt=location.rght) if "customer" in request.GET: customer = Customer.objects.using(request.database).get( name__exact=unquote(request.GET["customer"])) q = q.filter(customer_lft__gte=customer.lft, customer_lft__lt=customer.rght) if "status_in" in request.GET: status = unquote(request.GET["status_in"]) q = q.filter(status__in=status.split(",")) return q.annotate( plannedshort=RawSQL("quantity - plannedquantity", [])) rows = ( GridFieldText( "name", title=_("name"), key=True, formatter="detail", extra='"role":"input/demand"', ), GridFieldHierarchicalText( "item", title=_("item"), field_name="item__name", formatter="detail", extra='"role":"input/item"', model=Item, ), GridFieldText("batch", title=_("batch"), initially_hidden=True), GridFieldHierarchicalText( "location", title=_("location"), field_name="location__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldHierarchicalText( "customer", title=_("customer"), field_name="customer__name", formatter="detail", extra='"role":"input/customer"', model=Customer, ), GridFieldChoice("status", title=_("status"), choices=Demand.demandstatus), GridFieldNumber("quantity", title=_("quantity")), GridFieldDateTime("due", title=_("due")), GridFieldDuration("delay", title=_("delay"), editable=False, extra='"formatter":delayfmt'), GridFieldNumber( "plannedquantity", title=_("planned quantity"), editable=False, extra= '"formatoptions":{"defaultValue":""}, "cellattr":plannedquantitycellattr', ), GridFieldNumber( "plannedshort", title=_("quantity planned short"), editable=False, extra= '"formatoptions":{"defaultValue":""}, "cellattr":plannedquantitycellattr', ), GridFieldDateTime("deliverydate", title=_("delivery date"), editable=False), GridFieldText("description", title=_("description"), initially_hidden=True), GridFieldText("category", title=_("category"), initially_hidden=True), GridFieldText("subcategory", title=_("subcategory"), initially_hidden=True), GridFieldText( "operation", title=_("delivery operation"), field_name="operation__name", formatter="detail", extra='"role":"input/operation"', initially_hidden=True, ), GridFieldInteger("priority", title=_("priority")), GridFieldText( "owner", title=_("owner"), field_name="owner__name", formatter="detail", extra='"role":"input/demand"', initially_hidden=True, ), GridFieldDuration("maxlateness", title=_("maximum lateness"), initially_hidden=True), GridFieldNumber("minshipment", title=_("minimum shipment"), initially_hidden=True), GridFieldText("batch", title=_("batch"), field_name="batch", initially_hidden=True), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), # Optional fields referencing the item GridFieldText( "item__type", title=format_lazy("{} - {}", _("item"), _("type")), initially_hidden=True, editable=False, ), GridFieldText( "item__description", title=format_lazy("{} - {}", _("item"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "item__category", title=format_lazy("{} - {}", _("item"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "item__subcategory", title=format_lazy("{} - {}", _("item"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "item__owner", title=format_lazy("{} - {}", _("item"), _("owner")), field_name="item__owner__name", initially_hidden=True, editable=False, formatter="detail", extra='"role":"input/item"', ), GridFieldCurrency( "item__cost", title=format_lazy("{} - {}", _("item"), _("cost")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__volume", title=format_lazy("{} - {}", _("item"), _("volume")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__weight", title=format_lazy("{} - {}", _("item"), _("weight")), initially_hidden=True, editable=False, ), GridFieldInteger( "item__periodofcover", title=format_lazy("{} - {}", _("item"), _("period of cover")), initially_hidden=True, editable=False, ), GridFieldText( "item__source", title=format_lazy("{} - {}", _("item"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "item__lastmodified", title=format_lazy("{} - {}", _("item"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the location GridFieldText( "location__description", title=format_lazy("{} - {}", _("location"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "location__category", title=format_lazy("{} - {}", _("location"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "location__subcategory", title=format_lazy("{} - {}", _("location"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "location__available", title=format_lazy("{} - {}", _("location"), _("available")), initially_hidden=True, field_name="location__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "location__owner", title=format_lazy("{} - {}", _("location"), _("owner")), initially_hidden=True, field_name="location__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "location__source", title=format_lazy("{} - {}", _("location"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "location__lastmodified", title=format_lazy("{} - {}", _("location"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the customer GridFieldText( "customer__description", title=format_lazy("{} - {}", _("customer"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "customer__category", title=format_lazy("{} - {}", _("customer"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "customer__subcategory", title=format_lazy("{} - {}", _("customer"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "customer__owner", title=format_lazy("{} - {}", _("customer"), _("owner")), initially_hidden=True, field_name="customer__owner__name", formatter="detail", extra='"role":"input/customer"', editable=False, ), GridFieldText( "customer__source", title=format_lazy("{} - {}", _("customer"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "customer__lastmodified", title=format_lazy("{} - {}", _("customer"), _("last modified")), initially_hidden=True, editable=False, ), ) if settings.ERP_CONNECTOR: actions = [{ "name": "erp_incr_export", "label": format_lazy("export to {erp}", erp=settings.ERP_CONNECTOR), "function": "ERPconnection.SODepExport(jQuery('#grid'),'SO')", }] else: actions = [ { "name": "inquiry", "label": format_lazy(_("change status to {status}"), status=_("inquiry")), "function": "grid.setStatus('inquiry')", }, { "name": "quote", "label": format_lazy(_("change status to {status}"), status=_("quote")), "function": "grid.setStatus('quote')", }, { "name": "open", "label": format_lazy(_("change status to {status}"), status=_("open")), "function": "grid.setStatus('open')", }, { "name": "closed", "label": format_lazy(_("change status to {status}"), status=_("closed")), "function": "grid.setStatus('closed')", }, { "name": "canceled", "label": format_lazy(_("change status to {status}"), status=_("canceled")), "function": "grid.setStatus('canceled')", }, ]
class DistributionOrderList(OperationPlanMixin, GridReport): template = "input/operationplanreport.html" title = _("distribution orders") default_sort = (1, "desc") model = DistributionOrder frozenColumns = 1 multiselect = True editable = True height = 250 help_url = "modeling-wizard/distribution/distribution-orders.html" @classmethod def extra_context(reportclass, request, *args, **kwargs): if args and args[0]: paths = request.path.split("/") if paths[4] == "operationplanmaterial": return { "active_tab": "distributionorders", "model": Item, "title": force_text(Item._meta.verbose_name) + " " + args[0], "post_title": force_text( _("in transit in %(loc)s at %(date)s") % {"loc": args[1], "date": args[2]} ), } elif paths[4] == "produced": return { "active_tab": "distributionorders", "model": Item, "title": force_text(Item._meta.verbose_name) + " " + args[0], "post_title": force_text( _("received in %(loc)s between %(date1)s and %(date2)s") % {"loc": args[1], "date1": args[2], "date2": args[3]} ), } elif paths[4] == "consumed": return { "active_tab": "distributionorders", "model": Item, "title": force_text(Item._meta.verbose_name) + " " + args[0], "post_title": force_text( _("shipped from %(loc)s between %(date1)s and %(date2)s") % {"loc": args[1], "date1": args[2], "date2": args[3]} ), } elif paths[4] == "item": return { "active_tab": "distributionorders", "model": Item, "title": force_text(Item._meta.verbose_name) + " " + args[0], "post_title": _("distribution orders"), } elif paths[4] == "location": path = paths[-2] if path == "in": return { "active_tab": "inboundorders", "model": Location, "title": force_text(Location._meta.verbose_name) + " " + args[0], "post_title": _("inbound distribution"), } elif path == "out": return { "active_tab": "outboundorders", "model": Location, "title": force_text(Location._meta.verbose_name) + " " + args[0], "post_title": _("outbound distribution"), } else: return {"active_tab": "edit", "model": Item} else: return {"active_tab": "edit"} @classmethod def basequeryset(reportclass, request, *args, **kwargs): q = DistributionOrder.objects.all() if args and args[0]: paths = request.path.split("/") if paths[4] == "operationplanmaterial": q = q.filter(Q(origin=args[1]) | Q(destination=args[1])).filter( item__name=args[0], startdate__lt=args[2], enddate__gte=args[2] ) elif paths[4] == "item": q = q.filter(item__name=args[0]) elif paths[4] == "produced": q = q.filter( destination__name=args[1], item__name=args[0], enddate__gte=args[2], enddate__lt=args[3], ) elif paths[4] == "consumed": q = q.filter( origin__name=args[1], item__name=args[0], startdate__gte=args[2], startdate__lt=args[3], ) elif paths[4] == "location": path = paths[-2] if path == "out": q = q.filter(origin_id=args[0]) elif path == "in": q = q.filter(destination_id=args[0]) q = reportclass.operationplanExtraBasequery(q, request) return q.annotate( total_cost=Cast(F("item__cost") * F("quantity"), output_field=FloatField()), total_volume=Cast( F("item__volume") * F("quantity"), output_field=FloatField() ), total_weight=Cast( F("item__weight") * F("quantity"), output_field=FloatField() ), feasible=RawSQL( "coalesce((operationplan.plan->>'feasible')::boolean, true)", [] ), computed_color=RawSQL( """ case when operationplan.color >= 999999 and operationplan.plan ? 'item' then 999999 - extract(epoch from operationplan.delay)/86400.0 + 1000000 when operationplan.color >= 999999 and not(operationplan.plan ? 'item') then 999999 - extract(epoch from operationplan.delay)/86400.0 else operationplan.color end """, [], ), ) rows = ( GridFieldText( "reference", title=_("reference"), key=True, formatter="detail", extra='role:"input/distributionorder"', editable=not settings.ERP_CONNECTOR, ), GridFieldNumber( "computed_color", title=_("inventory status"), formatter="color", width="125", editable=False, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldNumber("color", hidden=True), GridFieldHierarchicalText( "item", title=_("item"), field_name="item__name", formatter="detail", extra='"role":"input/item"', model=Item, ), GridFieldText( "origin", title=_("origin"), field_name="origin__name", formatter="detail", extra='"role":"input/location"', ), GridFieldText( "destination", title=_("destination"), field_name="destination__name", formatter="detail", extra='"role":"input/location"', ), GridFieldDateTime( "startdate", title=_("shipping date"), extra='"formatoptions":{"srcformat":"Y-m-d H:i:s","newformat":"Y-m-d H:i:s", "defaultValue":""}, "summaryType":"min"', ), GridFieldDateTime( "enddate", title=_("receipt date"), extra='"formatoptions":{"srcformat":"Y-m-d H:i:s","newformat":"Y-m-d H:i:s", "defaultValue":""}, "summaryType":"max"', ), GridFieldNumber( "quantity", title=_("quantity"), extra='"formatoptions":{"defaultValue":""}, "summaryType":"sum"', ), GridFieldChoice( "status", title=_("status"), choices=DistributionOrder.orderstatus, editable=not settings.ERP_CONNECTOR, ), GridFieldCurrency( "item__cost", title=format_lazy("{} - {}", _("item"), _("cost")), editable=False, extra='"formatoptions":{"defaultValue":""}, "summaryType":"max"', ), GridFieldNumber( "item__volume", title=format_lazy("{} - {}", _("item"), _("volume")), initially_hidden=True, editable=False, extra='"formatoptions":{"defaultValue":""}, "summaryType":"max"', ), GridFieldNumber( "item__weight", title=format_lazy("{} - {}", _("item"), _("weight")), initially_hidden=True, editable=False, extra='"formatoptions":{"defaultValue":""}, "summaryType":"max"', ), GridFieldCurrency( "total_cost", title=_("total cost"), editable=False, search=False, extra='"formatoptions":{"defaultValue":""}, "summaryType":"sum"', ), GridFieldNumber( "total_volume", title=_("total volume"), editable=False, search=False, extra='"formatoptions":{"defaultValue":""}, "summaryType":"sum"', ), GridFieldNumber( "total_weight", title=_("total weight"), editable=False, search=False, extra='"formatoptions":{"defaultValue":""}, "summaryType":"sum"', ), GridFieldText( "batch", title=_("batch"), editable="true", initially_hidden=True ), GridFieldNumber( "criticality", title=_("criticality"), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldDuration( "delay", title=_("delay"), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"max"', ), GridFieldJSON( "demands", title=_("demands"), editable=False, search=True, sortable=False, formatter="demanddetail", extra='"role":"input/demand"', ), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), GridFieldBool( "feasible", title=_("feasible"), editable=False, initially_hidden=True, search=False, ), # Optional fields referencing the item GridFieldText( "item__type", title=format_lazy("{} - {}", _("item"), _("type")), initially_hidden=True, editable=False, ), GridFieldText( "item__description", title=format_lazy("{} - {}", _("item"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "item__category", title=format_lazy("{} - {}", _("item"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "item__subcategory", title=format_lazy("{} - {}", _("item"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "item__owner", title=format_lazy("{} - {}", _("item"), _("owner")), field_name="item__owner__name", initially_hidden=True, editable=False, ), GridFieldText( "item__source", title=format_lazy("{} - {}", _("item"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "item__lastmodified", title=format_lazy("{} - {}", _("item"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the origin location GridFieldText( "origin__description", title=format_lazy("{} - {}", _("origin"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "origin__category", title=format_lazy("{} - {}", _("origin"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "origin__subcategory", title=format_lazy("{} - {}", _("origin"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "origin__available", title=format_lazy("{} - {}", _("origin"), _("available")), initially_hidden=True, field_name="origin__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "origin__owner", title=format_lazy("{} - {}", _("origin"), _("owner")), initially_hidden=True, field_name="origin__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "origin__source", title=format_lazy("{} - {}", _("origin"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "origin__lastmodified", title=format_lazy("{} - {}", _("origin"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the destination location GridFieldText( "destination__description", title=format_lazy("{} - {}", _("destination"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "destination__category", title=format_lazy("{} - {}", _("destination"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "destination__subcategory", title=format_lazy("{} - {}", _("destination"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "destination__available", title=format_lazy("{} - {}", _("destination"), _("available")), initially_hidden=True, field_name="origin__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "destination__owner", title=format_lazy("{} - {}", _("destination"), _("owner")), initially_hidden=True, field_name="origin__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "destination__source", title=format_lazy("{} - {}", _("destination"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "destination__lastmodified", title=format_lazy("{} - {}", _("destination"), _("last modified")), initially_hidden=True, editable=False, ), GridFieldText( "end_items", title=_("end items"), editable=False, search=False, sortable=False, initially_hidden=True, formatter="listdetail", extra='"role":"input/item"', ), ) if settings.ERP_CONNECTOR: actions = [ { "name": "erp_incr_export", "label": format_lazy("export to {erp}", erp=settings.ERP_CONNECTOR), "function": "ERPconnection.IncrementalExport(jQuery('#grid'),'DO')", } ] else: actions = [ { "name": "proposed", "label": format_lazy( _("change status to {status}"), status=_("proposed") ), "function": "grid.setStatus('proposed')", }, { "name": "approved", "label": format_lazy( _("change status to {status}"), status=_("approved") ), "function": "grid.setStatus('approved')", }, { "name": "confirmed", "label": format_lazy( _("change status to {status}"), status=_("confirmed") ), "function": "grid.setStatus('confirmed')", }, { "name": "completed", "label": format_lazy( _("change status to {status}"), status=_("completed") ), "function": "grid.setStatus('completed')", }, { "name": "closed", "label": format_lazy( _("change status to {status}"), status=_("closed") ), "function": "grid.setStatus('closed')", }, ] @classmethod def initialize(reportclass, request): if reportclass._attributes_added != 2: reportclass._attributes_added = 2 for f in getAttributeFields(DistributionOrder): reportclass.rows += (f,) for f in getAttributeFields(Item, related_name_prefix="item"): f.editable = False reportclass.rows += (f,) for f in getAttributeFields(Location, related_name_prefix="origin"): f.editable = False reportclass.rows += (f,) for f in getAttributeFields(Location, related_name_prefix="destination"): f.editable = False reportclass.rows += (f,)
class ItemDistributionList(GridReport): title = _("item distributions") basequeryset = ItemDistribution.objects.all() model = ItemDistribution frozenColumns = 1 help_url = "modeling-wizard/distribution/item-distributions.html" rows = ( GridFieldInteger( "id", title=_("identifier"), key=True, formatter="detail", extra='"role":"input/itemdistribution"', initially_hidden=True, ), GridFieldHierarchicalText( "item", title=_("item"), field_name="item__name", formatter="detail", extra='"role":"input/item"', model=Item, ), GridFieldHierarchicalText( "location", title=_("location"), field_name="location__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldHierarchicalText( "origin", title=_("origin"), field_name="origin__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldDuration("leadtime", title=_("lead time")), GridFieldNumber("sizeminimum", title=_("size minimum")), GridFieldNumber("sizemultiple", title=_("size multiple")), GridFieldNumber("sizemaximum", title=_("size maximum"), initially_hidden=True), GridFieldCurrency("cost", title=_("cost"), initially_hidden=True), GridFieldInteger("priority", title=_("priority"), initially_hidden=True), GridFieldDuration("fence", title=_("fence"), initially_hidden=True), GridFieldDateTime( "effective_start", title=_("effective start"), initially_hidden=True ), GridFieldDateTime( "effective_end", title=_("effective end"), initially_hidden=True ), GridFieldText( "resource", title=_("resource"), field_name="resource__name", formatter="detail", extra='"role":"input/resource"', initially_hidden=True, ), GridFieldNumber( "resource_qty", title=_("resource quantity"), initially_hidden=True ), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), # Optional fields referencing the item GridFieldText( "item__type", title=format_lazy("{} - {}", _("item"), _("type")), initially_hidden=True, editable=False, ), GridFieldText( "item__description", title=format_lazy("{} - {}", _("item"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "item__category", title=format_lazy("{} - {}", _("item"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "item__subcategory", title=format_lazy("{} - {}", _("item"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldCurrency( "item__cost", title=format_lazy("{} - {}", _("item"), _("cost")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__volume", title=format_lazy("{} - {}", _("item"), _("volume")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__weight", title=format_lazy("{} - {}", _("item"), _("weight")), initially_hidden=True, editable=False, ), GridFieldText( "item__owner", title=format_lazy("{} - {}", _("item"), _("owner")), field_name="item__owner__name", initially_hidden=True, editable=False, ), GridFieldText( "item__source", title=format_lazy("{} - {}", _("item"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "item__lastmodified", title=format_lazy("{} - {}", _("item"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the location GridFieldText( "location__description", title=format_lazy("{} - {}", _("location"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "location__category", title=format_lazy("{} - {}", _("location"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "location__subcategory", title=format_lazy("{} - {}", _("location"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "location__available", title=format_lazy("{} - {}", _("location"), _("available")), initially_hidden=True, field_name="location__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "location__owner", title=format_lazy("{} - {}", _("location"), _("owner")), initially_hidden=True, field_name="location__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "location__source", title=format_lazy("{} - {}", _("location"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "location__lastmodified", title=format_lazy("{} - {}", _("location"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the origin location GridFieldText( "origin__description", title=format_lazy("{} - {}", _("origin"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "origin__category", title=format_lazy("{} - {}", _("origin"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "origin__subcategory", title=format_lazy("{} - {}", _("origin"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "origin__available", title=format_lazy("{} - {}", _("origin"), _("available")), initially_hidden=True, field_name="origin__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "origin__owner", title=format_lazy("{} - {}", _("origin"), _("owner")), initially_hidden=True, field_name="origin__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "origin__source", title=format_lazy("{} - {}", _("origin"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "origin__lastmodified", title=format_lazy("{} - {}", _("origin"), _("last modified")), initially_hidden=True, editable=False, ), )
class BufferList(GridReport): title = _("buffers") basequeryset = Buffer.objects.all() model = Buffer frozenColumns = 1 help_url = "modeling-wizard/master-data/buffers.html" rows = ( GridFieldInteger( "id", title=_("identifier"), key=True, formatter="detail", extra='"role":"input/buffer"', initially_hidden=True, ), GridFieldText("description", title=_("description")), GridFieldText("category", title=_("category"), initially_hidden=True), GridFieldText("subcategory", title=_("subcategory"), initially_hidden=True), GridFieldHierarchicalText( "location", title=_("location"), field_name="location__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldText( "item", title=_("item"), field_name="item__name", formatter="detail", extra='"role":"input/item"', ), GridFieldText( "batch", title=_("batch"), field_name="batch", initially_hidden=True ), GridFieldNumber("onhand", title=_("onhand")), GridFieldChoice("type", title=_("type"), choices=Buffer.types), GridFieldNumber("minimum", title=_("minimum")), GridFieldText( "minimum_calendar", title=_("minimum calendar"), field_name="minimum_calendar__name", formatter="detail", extra='"role":"input/calendar"', initially_hidden=True, ), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), # Optional fields referencing the item GridFieldText( "item__type", title=format_lazy("{} - {}", _("item"), _("type")), initially_hidden=True, editable=False, ), GridFieldText( "item__description", title=format_lazy("{} - {}", _("item"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "item__category", title=format_lazy("{} - {}", _("item"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "item__subcategory", title=format_lazy("{} - {}", _("item"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldCurrency( "item__cost", title=format_lazy("{} - {}", _("item"), _("cost")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__volume", title=format_lazy("{} - {}", _("item"), _("volume")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__weight", title=format_lazy("{} - {}", _("item"), _("weight")), initially_hidden=True, editable=False, ), GridFieldText( "item__owner", title=format_lazy("{} - {}", _("item"), _("owner")), field_name="item__owner__name", initially_hidden=True, editable=False, ), GridFieldText( "item__source", title=format_lazy("{} - {}", _("item"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "item__lastmodified", title=format_lazy("{} - {}", _("item"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the location GridFieldText( "location__description", title=format_lazy("{} - {}", _("location"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "location__category", title=format_lazy("{} - {}", _("location"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "location__subcategory", title=format_lazy("{} - {}", _("location"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "location__available", title=format_lazy("{} - {}", _("location"), _("available")), initially_hidden=True, field_name="location__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "location__owner", title=format_lazy("{} - {}", _("location"), _("owner")), initially_hidden=True, field_name="location__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "location__source", title=format_lazy("{} - {}", _("location"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "location__lastmodified", title=format_lazy("{} - {}", _("location"), _("last modified")), initially_hidden=True, editable=False, ), )
class ResourceList(GridReport): title = _("resources") basequeryset = Resource.objects.all() model = Resource frozenColumns = 1 help_url = "modeling-wizard/manufacturing-capacity/resources.html" message_when_empty = Template(""" <h3>Define resources</h3> <br> Resources represent capacity.<br> They represent a machine, a group of machines, an operator, a group of operators, or some logical capacity constraint.<br> <br><br> <div role="group" class="btn-group.btn-group-justified"> <a href="{{request.prefix}}/data/input/resource/add/" class="btn btn-primary">Create a single resource<br>in a form</a> <a href="{{request.prefix}}/wizard/load/production/?currentstep=8" class="btn btn-primary">Wizard to upload resources<br>from a spreadsheet</a> </div> <br> """) rows = ( GridFieldText( "name", title=_("name"), key=True, formatter="detail", extra='"role":"input/resource"', ), GridFieldText("description", title=_("description")), GridFieldText("category", title=_("category"), initially_hidden=True), GridFieldText("subcategory", title=_("subcategory"), initially_hidden=True), GridFieldHierarchicalText( "location", title=_("location"), field_name="location__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldText( "owner", title=_("owner"), field_name="owner__name", formatter="detail", extra='"role":"input/resource"', initially_hidden=True, ), GridFieldChoice("type", title=_("type"), choices=Resource.types), GridFieldBool("constrained", title=_("constrained")), GridFieldNumber("maximum", title=_("maximum")), GridFieldText( "maximum_calendar", title=_("maximum calendar"), field_name="maximum_calendar__name", formatter="detail", extra='"role":"input/calendar"', ), GridFieldText( "available", title=_("available"), field_name="available__name", formatter="detail", extra='"role":"input/calendar"', ), GridFieldCurrency("cost", title=_("cost"), initially_hidden=True), GridFieldDuration("maxearly", title=_("maxearly"), initially_hidden=True), GridFieldText( "setupmatrix", title=_("setup matrix"), field_name="setupmatrix__name", formatter="detail", extra='"role":"input/setupmatrix"', initially_hidden=True, ), GridFieldText("setup", title=_("setup"), initially_hidden=True), GridFieldText("source", title=_("source"), initially_hidden=True), # Translator: xgettext:no-python-format GridFieldNumber("efficiency", title=_("efficiency %"), formatter="percentage"), GridFieldText( "efficiency_calendar", # Translator: xgettext:no-python-format title=_("efficiency % calendar"), initially_hidden=True, field_name="efficiency_calendar__name", formatter="detail", extra='"role":"input/calendar"', ), GridFieldLastModified("lastmodified"), # Optional fields referencing the location GridFieldText( "location__description", title=format_lazy("{} - {}", _("location"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "location__category", title=format_lazy("{} - {}", _("location"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "location__subcategory", title=format_lazy("{} - {}", _("location"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "location__available", title=format_lazy("{} - {}", _("location"), _("available")), initially_hidden=True, field_name="location__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "location__owner", title=format_lazy("{} - {}", _("location"), _("owner")), initially_hidden=True, field_name="location__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "location__source", title=format_lazy("{} - {}", _("location"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "location__lastmodified", title=format_lazy("{} - {}", _("location"), _("last modified")), initially_hidden=True, editable=False, ), )
class ResourceList(GridReport): title = _("resources") basequeryset = Resource.objects.all() model = Resource frozenColumns = 1 help_url = "modeling-wizard/manufacturing-capacity/resources.html" rows = ( GridFieldText( "name", title=_("name"), key=True, formatter="detail", extra='"role":"input/resource"', ), GridFieldText("description", title=_("description")), GridFieldText("category", title=_("category"), initially_hidden=True), GridFieldText("subcategory", title=_("subcategory"), initially_hidden=True), GridFieldHierarchicalText( "location", title=_("location"), field_name="location__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldText( "owner", title=_("owner"), field_name="owner__name", formatter="detail", extra='"role":"input/resource"', initially_hidden=True, ), GridFieldChoice("type", title=_("type"), choices=Resource.types), GridFieldBool("constrained", title=_("constrained")), GridFieldNumber("maximum", title=_("maximum")), GridFieldText( "maximum_calendar", title=_("maximum calendar"), field_name="maximum_calendar__name", formatter="detail", extra='"role":"input/calendar"', ), GridFieldText( "available", title=_("available"), field_name="available__name", formatter="detail", extra='"role":"input/calendar"', ), GridFieldCurrency("cost", title=_("cost"), initially_hidden=True), GridFieldDuration("maxearly", title=_("maxearly"), initially_hidden=True), GridFieldText( "setupmatrix", title=_("setup matrix"), field_name="setupmatrix__name", formatter="detail", extra='"role":"input/setupmatrix"', initially_hidden=True, ), GridFieldText("setup", title=_("setup"), initially_hidden=True), GridFieldText("source", title=_("source"), initially_hidden=True), # Translator: xgettext:no-python-format GridFieldNumber("efficiency", title=_("efficiency %"), formatter="percentage"), GridFieldText( "efficiency_calendar", # Translator: xgettext:no-python-format title=_("efficiency % calendar"), initially_hidden=True, field_name="efficiency_calendar__name", formatter="detail", extra='"role":"input/calendar"', ), GridFieldLastModified("lastmodified"), # Optional fields referencing the location GridFieldText( "location__description", title=format_lazy("{} - {}", _("location"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "location__category", title=format_lazy("{} - {}", _("location"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "location__subcategory", title=format_lazy("{} - {}", _("location"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "location__available", title=format_lazy("{} - {}", _("location"), _("available")), initially_hidden=True, field_name="location__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "location__owner", title=format_lazy("{} - {}", _("location"), _("owner")), initially_hidden=True, field_name="location__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "location__source", title=format_lazy("{} - {}", _("location"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "location__lastmodified", title=format_lazy("{} - {}", _("location"), _("last modified")), initially_hidden=True, editable=False, ), )
class PurchaseOrderList(OperationPlanMixin, GridReport): template = "input/operationplanreport.html" title = _("purchase orders") model = PurchaseOrder default_sort = (1, "desc") frozenColumns = 1 multiselect = True editable = True height = 250 help_url = "modeling-wizard/purchasing/purchase-orders.html" message_when_empty = Template( """ <h3>Define purchase orders</h3> <br> This table defines ongoing and proposed purchase orders.<br><br> Use this table to load ongoing purchase orders in the status "confirmed".<br><br> The planning algorithm will further populate this table with additional "proposed" purchase orders for the future.<br> <br><br> <div role="group" class="btn-group.btn-group-justified"> <a href="{{request.prefix}}/data/input/purchaseorder/add/" onclick="window.location = $(event.target).attr('href')" class="btn btn-primary">Create a single purchase order<br>in a form</a> <a href="{{request.prefix}}/wizard/load/production/?currentstep=7" onclick="window.location = $(event.target).attr('href')" class="btn btn-primary">Wizard to upload purchase orders<br>from a spreadsheet</a> </div> <br> """ ) calendarmode = "start_end" @classmethod def extra_context(reportclass, request, *args, **kwargs): if args and args[0]: request.session["lasttab"] = "purchaseorders" paths = request.path.split("/") path = paths[4] if path == "supplier" or request.path.startswith("/detail/input/supplier/"): return { "default_operationplan_type": "PO", "groupBy": "status", "active_tab": "purchaseorders", "model": Supplier, "title": force_text(Supplier._meta.verbose_name) + " " + args[0], "post_title": _("purchase orders"), } elif path == "location" or request.path.startswith( "/detail/input/location/" ): return { "default_operationplan_type": "PO", "groupBy": "status", "active_tab": "purchaseorders", "model": Location, "title": force_text(Location._meta.verbose_name) + " " + args[0], "post_title": _("purchase orders"), } elif path == "item" or request.path.startswith("/detail/input/item/"): return { "default_operationplan_type": "PO", "groupBy": "status", "active_tab": "purchaseorders", "model": Item, "title": force_text(Item._meta.verbose_name) + " " + args[0], "post_title": _("purchase orders"), } elif path == "operationplanmaterial": return { "default_operationplan_type": "PO", "groupBy": "status", "active_tab": "purchaseorders", "model": Item, "title": force_text(Item._meta.verbose_name) + " " + args[0], "post_title": force_text( _("on order in %(loc)s at %(date)s") % {"loc": args[1], "date": args[2]} ), } elif path == "produced": return { "default_operationplan_type": "PO", "groupBy": "status", "active_tab": "purchaseorders", "model": Item, "title": force_text(Item._meta.verbose_name) + " " + args[0], "post_title": force_text( _("on order in %(loc)s between %(date1)s and %(date2)s") % {"loc": args[1], "date1": args[2], "date2": args[3]} ), } else: return { "default_operationplan_type": "PO", "groupBy": "status", "active_tab": "edit", "model": Item, } elif "parentreference" in request.GET: return { "default_operationplan_type": "PO", "groupBy": "status", "active_tab": "edit", "title": force_text(PurchaseOrder._meta.verbose_name) + " " + request.GET["parentreference"], } else: return { "default_operationplan_type": "PO", "groupBy": "status", "active_tab": "purchaseorders", } @classmethod def basequeryset(reportclass, request, *args, **kwargs): q = PurchaseOrder.objects.all() if "calendarstart" in request.GET: q = q.filter( Q(enddate__gte=request.GET["calendarstart"]) | ( Q(enddate__isnull=True) & Q(startdate__gte=request.GET["calendarstart"]) ) ) if "calendarend" in request.GET: q = q.filter( Q(startdate__lte=request.GET["calendarend"]) | ( Q(startdate__isnull=True) & Q(enddate__lte=request.GET["calendarend"]) ) ) if args and args[0]: paths = request.path.split("/") path = paths[4] if paths[4] == "operationplanmaterial": q = q.filter( location__name=args[1], item__name=args[0], startdate__lt=args[2], enddate__gte=args[2], ) elif path == "produced": q = q.filter( location__name=args[1], item__name=args[0], enddate__gte=args[2], enddate__lt=args[3], ) elif path == "supplier" or request.path.startswith( "/detail/input/supplier/" ): try: Supplier.rebuildHierarchy(database=request.database) sup = ( Supplier.objects.all().using(request.database).get(name=args[0]) ) lft = sup.lft rght = sup.rght except Supplier.DoesNotExist: lft = 1 rght = 1 q = q.filter(supplier__lft__gte=lft, supplier__rght__lte=rght) elif path == "location" or request.path.startswith( "/detail/input/location/" ): try: Location.rebuildHierarchy(database=request.database) loc = ( Location.objects.all().using(request.database).get(name=args[0]) ) lft = loc.lft rght = loc.rght except Location.DoesNotExist: lft = 1 rght = 1 q = q.filter(location__lft__gte=lft, location__rght__lte=rght) elif path == "item" or request.path.startswith("/detail/input/item/"): try: Item.rebuildHierarchy(database=request.database) itm = Item.objects.all().using(request.database).get(name=args[0]) lft = itm.lft rght = itm.rght except Item.DoesNotExist: lft = 1 rght = 1 q = q.filter(item__lft__gte=lft, item__rght__lte=rght) q = reportclass.operationplanExtraBasequery(q.select_related("item"), request) return q.annotate( unit_cost=Cast( RawSQL( """ coalesce(( select cost from itemsupplier where itemsupplier.item_id = operationplan.item_id and (itemsupplier.location_id is null or itemsupplier.location_id = operationplan.location_id) and itemsupplier.supplier_id = operationplan.supplier_id order by operationplan.enddate < itemsupplier.effective_end desc nulls first, operationplan.enddate >= itemsupplier.effective_start desc nulls first, priority <> 0, priority limit 1), (select cost from item where item.name = operationplan.item_id), 0) """, [], ), output_field=FloatField(), ), total_cost=Cast(F("unit_cost") * F("quantity"), output_field=FloatField()), total_volume=Cast( F("item__volume") * F("quantity"), output_field=FloatField() ), total_weight=Cast( F("item__weight") * F("quantity"), output_field=FloatField() ), feasible=RawSQL( "coalesce((operationplan.plan->>'feasible')::boolean, true)", [] ), computed_color=RawSQL( """ case when operationplan.color >= 999999 and operationplan.plan ? 'item' then 999999 - extract(epoch from operationplan.delay)/86400.0 + 1000000 when operationplan.color >= 999999 and not(operationplan.plan ? 'item') then 999999 - extract(epoch from operationplan.delay)/86400.0 else operationplan.color end """, [], ), itemsupplier_sizeminimum=Cast( RawSQL( """ select sizeminimum from itemsupplier where itemsupplier.item_id = operationplan.item_id and (itemsupplier.location_id is null or itemsupplier.location_id = operationplan.location_id) and itemsupplier.supplier_id = operationplan.supplier_id order by operationplan.enddate < itemsupplier.effective_end desc nulls first, operationplan.enddate >= itemsupplier.effective_start desc nulls first, priority <> 0, priority limit 1 """, [], ), output_field=FloatField(), ), itemsupplier_sizemultiple=Cast( RawSQL( """ select sizemultiple from itemsupplier where itemsupplier.item_id = operationplan.item_id and (itemsupplier.location_id is null or itemsupplier.location_id = operationplan.location_id) and itemsupplier.supplier_id = operationplan.supplier_id order by operationplan.enddate < itemsupplier.effective_end desc nulls first, operationplan.enddate >= itemsupplier.effective_start desc nulls first, priority <> 0, priority limit 1 """, [], ), output_field=FloatField(), ), itemsupplier_sizemaximum=Cast( RawSQL( """ select sizemaximum from itemsupplier where itemsupplier.item_id = operationplan.item_id and (itemsupplier.location_id is null or itemsupplier.location_id = operationplan.location_id) and itemsupplier.supplier_id = operationplan.supplier_id order by operationplan.enddate < itemsupplier.effective_end desc nulls first, operationplan.enddate >= itemsupplier.effective_start desc nulls first, priority <> 0, priority limit 1 """, [], ), output_field=FloatField(), ), itemsupplier_priority=Cast( RawSQL( """ select priority from itemsupplier where itemsupplier.item_id = operationplan.item_id and (itemsupplier.location_id is null or itemsupplier.location_id = operationplan.location_id) and itemsupplier.supplier_id = operationplan.supplier_id order by operationplan.enddate < itemsupplier.effective_end desc nulls first, operationplan.enddate >= itemsupplier.effective_start desc nulls first, priority <> 0, priority limit 1 """, [], ), output_field=FloatField(), ), itemsupplier_effective_start=Cast( RawSQL( """ select effective_start from itemsupplier where itemsupplier.item_id = operationplan.item_id and (itemsupplier.location_id is null or itemsupplier.location_id = operationplan.location_id) and itemsupplier.supplier_id = operationplan.supplier_id order by operationplan.enddate < itemsupplier.effective_end desc nulls first, operationplan.enddate >= itemsupplier.effective_start desc nulls first, priority <> 0, priority limit 1 """, [], ), output_field=DateTimeField(), ), itemsupplier_effective_end=Cast( RawSQL( """ select effective_end from itemsupplier where itemsupplier.item_id = operationplan.item_id and (itemsupplier.location_id is null or itemsupplier.location_id = operationplan.location_id) and itemsupplier.supplier_id = operationplan.supplier_id order by operationplan.enddate < itemsupplier.effective_end desc nulls first, operationplan.enddate >= itemsupplier.effective_start desc nulls first, priority <> 0, priority limit 1 """, [], ), output_field=DateTimeField(), ), ) rows = ( GridFieldText( "reference", title=_("reference"), key=True, formatter="detail", extra='role:"input/purchaseorder"', editable=not settings.ERP_CONNECTOR, ), GridFieldNumber( "computed_color", title=_("inventory status"), formatter="color", width="125", editable=False, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldNumber("color", hidden=True), GridFieldHierarchicalText( "item", title=_("item"), field_name="item__name", formatter="detail", extra='"role":"input/item"', model=Item, ), GridFieldHierarchicalText( "location", title=_("location"), field_name="location__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldHierarchicalText( "supplier", title=_("supplier"), field_name="supplier__name", formatter="detail", extra='"role":"input/supplier"', model=Supplier, ), GridFieldDateTime( "startdate", title=_("ordering date"), extra='"formatoptions":{"srcformat":"Y-m-d H:i:s","newformat":"Y-m-d H:i:s", "defaultValue":""}, "summaryType":"min"', ), GridFieldDateTime( "enddate", title=_("receipt date"), extra='"formatoptions":{"srcformat":"Y-m-d H:i:s","newformat":"Y-m-d H:i:s", "defaultValue":""}, "summaryType":"max"', ), GridFieldNumber( "quantity", title=_("quantity"), extra='"formatoptions":{"defaultValue":""}, "summaryType":"sum"', ), GridFieldChoice( "status", title=_("status"), choices=PurchaseOrder.orderstatus, editable=not settings.ERP_CONNECTOR, ), GridFieldCurrency( "unit_cost", title=format_lazy("{} - {}", _("item"), _("cost")), editable=False, search=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"max"', ), GridFieldCurrency( "total_cost", title=_("total cost"), editable=False, search=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"sum"', ), GridFieldNumber( "total_volume", title=_("total volume"), editable=False, search=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"sum"', ), GridFieldNumber( "total_weight", title=_("total weight"), editable=False, search=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"sum"', ), GridFieldText( "batch", title=_("batch"), editable="true", initially_hidden=True ), GridFieldNumber( "criticality", title=_("criticality"), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldDuration( "delay", title=_("delay"), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"max"', ), GridFieldJSON( "demands", title=_("demands"), editable=False, search=True, sortable=False, formatter="demanddetail", extra='"role":"input/demand"', ), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldBool( "feasible", title=_("feasible"), editable=False, initially_hidden=True, search=True, ), GridFieldLastModified("lastmodified"), # Annoted fields referencing the itemsupplier GridFieldNumber( "itemsupplier_sizeminimum", title=format_lazy("{} - {}", _("item supplier"), _("size minimum")), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldNumber( "itemsupplier_sizemultiple", title=format_lazy("{} - {}", _("item supplier"), _("size multiple")), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldNumber( "itemsupplier_sizemaximum", title=format_lazy("{} - {}", _("item supplier"), _("size maximum")), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldDateTime( "itemsupplier_effective_end", title=format_lazy("{} - {}", _("item supplier"), _("effective end")), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldDateTime( "itemsupplier_effective_start", title=format_lazy("{} - {}", _("item supplier"), _("effective start")), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), GridFieldNumber( "itemsupplier_priority", title=format_lazy("{} - {}", _("item supplier"), _("priority")), editable=False, initially_hidden=True, extra='"formatoptions":{"defaultValue":""}, "summaryType":"min"', ), # Optional fields referencing the item GridFieldText( "item__type", title=format_lazy("{} - {}", _("item"), _("type")), initially_hidden=True, editable=False, ), GridFieldText( "item__description", title=format_lazy("{} - {}", _("item"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "item__category", title=format_lazy("{} - {}", _("item"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "item__subcategory", title=format_lazy("{} - {}", _("item"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__volume", title=format_lazy("{} - {}", _("item"), _("volume")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__weight", title=format_lazy("{} - {}", _("item"), _("weight")), initially_hidden=True, editable=False, ), GridFieldText( "item__owner", title=format_lazy("{} - {}", _("item"), _("owner")), field_name="item__owner__name", initially_hidden=True, editable=False, ), GridFieldText( "item__source", title=format_lazy("{} - {}", _("item"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "item__lastmodified", title=format_lazy("{} - {}", _("item"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the location GridFieldText( "location__description", title=format_lazy("{} - {}", _("location"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "location__category", title=format_lazy("{} - {}", _("location"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "location__subcategory", title=format_lazy("{} - {}", _("location"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "location__available", title=format_lazy("{} - {}", _("location"), _("available")), initially_hidden=True, field_name="location__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "location__owner", title=format_lazy("{} - {}", _("location"), _("owner")), initially_hidden=True, field_name="location__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "location__source", title=format_lazy("{} - {}", _("location"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "location__lastmodified", title=format_lazy("{} - {}", _("location"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the supplier GridFieldText( "supplier__description", title=format_lazy("{} - {}", _("supplier"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__category", title=format_lazy("{} - {}", _("supplier"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__subcategory", title=format_lazy("{} - {}", _("supplier"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__owner", title=format_lazy("{} - {}", _("supplier"), _("owner")), initially_hidden=True, field_name="supplier__owner__name", formatter="detail", extra='"role":"input/supplier"', editable=False, ), GridFieldText( "supplier__source", title=format_lazy("{} - {}", _("supplier"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "supplier__lastmodified", title=format_lazy("{} - {}", _("supplier"), _("last modified")), initially_hidden=True, editable=False, ), GridFieldText( "end_items", title=_("end items"), editable=False, search=False, sortable=False, initially_hidden=True, formatter="listdetail", extra='"role":"input/item"', ), ) if settings.ERP_CONNECTOR: actions = [ { "name": "erp_incr_export", "label": format_lazy("export to {erp}", erp=settings.ERP_CONNECTOR), "function": "ERPconnection.IncrementalExport(jQuery('#grid'),'PO')", } ] else: actions = [ { "name": "proposed", "label": format_lazy( _("change status to {status}"), status=_("proposed") ), "function": "grid.setStatus('proposed')", }, { "name": "approved", "label": format_lazy( _("change status to {status}"), status=_("approved") ), "function": "grid.setStatus('approved')", }, { "name": "confirmed", "label": format_lazy( _("change status to {status}"), status=_("confirmed") ), "function": "grid.setStatus('confirmed')", }, { "name": "completed", "label": format_lazy( _("change status to {status}"), status=_("completed") ), "function": "grid.setStatus('completed')", }, { "name": "closed", "label": format_lazy( _("change status to {status}"), status=_("closed") ), "function": "grid.setStatus('closed')", }, ] @classmethod def initialize(reportclass, request): if reportclass._attributes_added != 2: reportclass._attributes_added = 2 for f in getAttributeFields(PurchaseOrder): reportclass.rows += (f,) for f in getAttributeFields(Item, related_name_prefix="item"): f.editable = False reportclass.rows += (f,) for f in getAttributeFields(Location, related_name_prefix="location"): f.editable = False reportclass.rows += (f,) for f in getAttributeFields(Supplier, related_name_prefix="supplier"): f.editable = False reportclass.rows += (f,)
class ItemSupplierList(GridReport): title = _("item suppliers") basequeryset = ItemSupplier.objects.all() model = ItemSupplier frozenColumns = 1 help_url = "modeling-wizard/purchasing/item-suppliers.html" message_when_empty = Template( """ <h3>Define item suppliers</h3> <br> This table defines which items can be procured from which supplier.<br> <br><br> <div role="group" class="btn-group.btn-group-justified"> <a href="{{request.prefix}}/data/input/itemsupplier/add/" class="btn btn-primary">Create a single item supplier<br>in a form</a> <a href="{{request.prefix}}/wizard/load/production/?currentstep=4" class="btn btn-primary">Wizard to upload item suppliers<br>from a spreadsheet</a> </div> <br> """ ) rows = ( GridFieldInteger( "id", title=_("identifier"), key=True, formatter="detail", extra='"role":"input/itemsupplier"', initially_hidden=True, ), GridFieldHierarchicalText( "item", title=_("item"), field_name="item__name", formatter="detail", extra='"role":"input/item"', model=Item, ), GridFieldHierarchicalText( "location", title=_("location"), field_name="location__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldText( "supplier", title=_("supplier"), field_name="supplier__name", formatter="detail", extra='"role":"input/supplier"', ), GridFieldDuration("leadtime", title=_("lead time")), GridFieldNumber("sizeminimum", title=_("size minimum")), GridFieldNumber("sizemultiple", title=_("size multiple")), GridFieldNumber("sizemaximum", title=_("size maximum"), initially_hidden=True), GridFieldCurrency("cost", title=_("cost")), GridFieldInteger("priority", title=_("priority")), GridFieldDuration("fence", title=_("fence"), initially_hidden=True), GridFieldDateTime( "effective_start", title=_("effective start"), initially_hidden=True ), GridFieldDateTime( "effective_end", title=_("effective end"), initially_hidden=True ), GridFieldText( "resource", title=_("resource"), field_name="resource__name", formatter="detail", extra='"role":"input/resource"', initially_hidden=True, ), GridFieldNumber( "resource_qty", title=_("resource quantity"), initially_hidden=True ), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), # Optional fields referencing the item GridFieldText( "item__type", title=format_lazy("{} - {}", _("item"), _("type")), initially_hidden=True, editable=False, ), GridFieldText( "item__description", title=format_lazy("{} - {}", _("item"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "item__category", title=format_lazy("{} - {}", _("item"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "item__subcategory", title=format_lazy("{} - {}", _("item"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldCurrency( "item__cost", title=format_lazy("{} - {}", _("item"), _("cost")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__volume", title=format_lazy("{} - {}", _("item"), _("volume")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__weight", title=format_lazy("{} - {}", _("item"), _("weight")), initially_hidden=True, editable=False, ), GridFieldText( "item__owner", title=format_lazy("{} - {}", _("item"), _("owner")), field_name="item__owner__name", initially_hidden=True, editable=False, ), GridFieldText( "item__source", title=format_lazy("{} - {}", _("item"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "item__lastmodified", title=format_lazy("{} - {}", _("item"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the location GridFieldText( "location__description", title=format_lazy("{} - {}", _("location"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "location__category", title=format_lazy("{} - {}", _("location"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "location__subcategory", title=format_lazy("{} - {}", _("location"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "location__available", title=format_lazy("{} - {}", _("location"), _("available")), initially_hidden=True, field_name="location__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "location__owner", title=format_lazy("{} - {}", _("location"), _("owner")), initially_hidden=True, field_name="location__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "location__source", title=format_lazy("{} - {}", _("location"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "location__lastmodified", title=format_lazy("{} - {}", _("location"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the supplier GridFieldText( "supplier__description", title=format_lazy("{} - {}", _("supplier"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__category", title=format_lazy("{} - {}", _("supplier"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__subcategory", title=format_lazy("{} - {}", _("supplier"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__available", title=format_lazy("{} - {}", _("supplier"), _("available")), field_name="supplier__available__name", formatter="detail", extra='"role":"input/calendar"', initially_hidden=True, editable=False, ), GridFieldText( "supplier__source", title=format_lazy("{} - {}", _("supplier"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "supplier__lastmodified", title=format_lazy("{} - {}", _("supplier"), _("last modified")), initially_hidden=True, editable=False, ), ) @classmethod def initialize(reportclass, request): if reportclass._attributes_added != 2: reportclass._attributes_added = 2 reportclass.attr_sql = "" # Adding custom item attributes for f in getAttributeFields( Item, related_name_prefix="item", initially_hidden=True ): reportclass.rows += (f,) reportclass.attr_sql += "item.%s, " % f.name.split("__")[-1] # Adding custom location attributes for f in getAttributeFields( Location, related_name_prefix="location", initially_hidden=True ): reportclass.rows += (f,) reportclass.attr_sql += "location.%s, " % f.name.split("__")[-1]
class ItemSupplierList(GridReport): title = _("item suppliers") basequeryset = ItemSupplier.objects.all() model = ItemSupplier frozenColumns = 1 help_url = "modeling-wizard/purchasing/item-suppliers.html" rows = ( GridFieldInteger( "id", title=_("identifier"), key=True, formatter="detail", extra='"role":"input/itemsupplier"', initially_hidden=True, ), GridFieldHierarchicalText( "item", title=_("item"), field_name="item__name", formatter="detail", extra='"role":"input/item"', model=Item, ), GridFieldHierarchicalText( "location", title=_("location"), field_name="location__name", formatter="detail", extra='"role":"input/location"', model=Location, ), GridFieldText( "supplier", title=_("supplier"), field_name="supplier__name", formatter="detail", extra='"role":"input/supplier"', ), GridFieldDuration("leadtime", title=_("lead time")), GridFieldNumber("sizeminimum", title=_("size minimum")), GridFieldNumber("sizemultiple", title=_("size multiple")), GridFieldNumber("sizemaximum", title=_("size maximum"), initially_hidden=True), GridFieldCurrency("cost", title=_("cost")), GridFieldInteger("priority", title=_("priority")), GridFieldDuration("fence", title=_("fence"), initially_hidden=True), GridFieldDateTime("effective_start", title=_("effective start"), initially_hidden=True), GridFieldDateTime("effective_end", title=_("effective end"), initially_hidden=True), GridFieldText( "resource", title=_("resource"), field_name="resource__name", formatter="detail", extra='"role":"input/resource"', initially_hidden=True, ), GridFieldNumber("resource_qty", title=_("resource quantity"), initially_hidden=True), GridFieldText("source", title=_("source"), initially_hidden=True), GridFieldLastModified("lastmodified"), # Optional fields referencing the item GridFieldText( "item__type", title=format_lazy("{} - {}", _("item"), _("type")), initially_hidden=True, editable=False, ), GridFieldText( "item__description", title=format_lazy("{} - {}", _("item"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "item__category", title=format_lazy("{} - {}", _("item"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "item__subcategory", title=format_lazy("{} - {}", _("item"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldCurrency( "item__cost", title=format_lazy("{} - {}", _("item"), _("cost")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__volume", title=format_lazy("{} - {}", _("item"), _("volume")), initially_hidden=True, editable=False, ), GridFieldNumber( "item__weight", title=format_lazy("{} - {}", _("item"), _("weight")), initially_hidden=True, editable=False, ), GridFieldText( "item__owner", title=format_lazy("{} - {}", _("item"), _("owner")), field_name="item__owner__name", initially_hidden=True, editable=False, ), GridFieldText( "item__source", title=format_lazy("{} - {}", _("item"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "item__lastmodified", title=format_lazy("{} - {}", _("item"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the location GridFieldText( "location__description", title=format_lazy("{} - {}", _("location"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "location__category", title=format_lazy("{} - {}", _("location"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "location__subcategory", title=format_lazy("{} - {}", _("location"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "location__available", title=format_lazy("{} - {}", _("location"), _("available")), initially_hidden=True, field_name="location__available__name", formatter="detail", extra='"role":"input/calendar"', editable=False, ), GridFieldText( "location__owner", title=format_lazy("{} - {}", _("location"), _("owner")), initially_hidden=True, field_name="location__owner__name", formatter="detail", extra='"role":"input/location"', editable=False, ), GridFieldText( "location__source", title=format_lazy("{} - {}", _("location"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "location__lastmodified", title=format_lazy("{} - {}", _("location"), _("last modified")), initially_hidden=True, editable=False, ), # Optional fields referencing the supplier GridFieldText( "supplier__description", title=format_lazy("{} - {}", _("supplier"), _("description")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__category", title=format_lazy("{} - {}", _("supplier"), _("category")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__subcategory", title=format_lazy("{} - {}", _("supplier"), _("subcategory")), initially_hidden=True, editable=False, ), GridFieldText( "supplier__available", title=format_lazy("{} - {}", _("supplier"), _("available")), field_name="supplier__available__name", formatter="detail", extra='"role":"input/calendar"', initially_hidden=True, editable=False, ), GridFieldText( "supplier__source", title=format_lazy("{} - {}", _("supplier"), _("source")), initially_hidden=True, editable=False, ), GridFieldLastModified( "supplier__lastmodified", title=format_lazy("{} - {}", _("supplier"), _("last modified")), initially_hidden=True, editable=False, ), ) @classmethod def initialize(reportclass, request): if reportclass._attributes_added != 2: reportclass._attributes_added = 2 reportclass.attr_sql = "" # Adding custom item attributes for f in getAttributeFields(Item, related_name_prefix="item", initially_hidden=True): reportclass.rows += (f, ) reportclass.attr_sql += "item.%s, " % f.name.split("__")[-1] # Adding custom location attributes for f in getAttributeFields(Location, related_name_prefix="location", initially_hidden=True): reportclass.rows += (f, ) reportclass.attr_sql += "location.%s, " % f.name.split( "__")[-1]