예제 #1
0
파일: views.py 프로젝트: cash2one/lite-mms
 def __list_filters__(self):
     if SchedulerPermission.can():
         return [filters.EqualTo("finish_time", value=None),
                 filters.EqualTo("refined", value=True),
                 filters.EqualTo("dispatched", value=True),
                 only_unfinished_filter
         ]
     else:
         return []
예제 #2
0
파일: views.py 프로젝트: cash2one/lite-mms
class NodeModelView(ModelView):

    can_batchly_edit = False

    def try_create(self):
        raise PermissionDenied

    def try_edit(self, objs=None):
        handle_node.test()

    __list_columns__ = [
        column_spec.ColumnSpec('work_flow.id', label=u'工作流编号'),
        column_spec.ColumnSpec('name', label=u'名称'),
        column_spec.PlaceHolderColumnSpec(
            'annotation',
            label=u'描述',
            template_fname=
            'work-flow/permit-delivery-task-with-abnormal-weight-annotation.html'
        ),
        column_spec.ColumnSpec('create_time',
                               label=u'创建时间',
                               formatter=lambda v, obj: v.strftime(
                                   '%Y年%m月%d日 %H:%M').decode('utf-8')),
        column_spec.ColumnSpec('handle_time',
                               label=u'处理时间',
                               formatter=lambda v, obj: v.strftime(
                                   '%Y年%m月%d日 %H:%M').decode('utf-8')
                               if v else '--'),
        column_spec.ColumnSpec('work_flow.status',
                               label=u'工作流状态',
                               formatter=_get_literally_status)
    ]

    __sortable_columns__ = ['work_flow.id', 'create_time']

    __default_order__ = ("create_time", "desc")

    __column_filters__ = [
        filters.EqualTo('work_flow.id', name=u'是', display_col_name=u'工作流编号'),
        filters.Only('handle_time',
                     display_col_name=u'仅展示待处理工作流',
                     test=lambda col: col == None,
                     default_value=True,
                     notation="__only_unhandled"),
        filters.Between('create_time', name=u'介于', display_col_name=u'创建时间')
    ]

    def get_customized_actions(self, objs=None):
        return [_refuse_node, _approve_node]

    def __list_filters__(self):
        return [
            filters.EqualTo('handler_group_id', value=current_user.group.id),
        ]
예제 #3
0
파일: views.py 프로젝트: cash2one/lite-mms
    def get_column_filters(self):
        from datetime import datetime, timedelta

        today = datetime.today()
        yesterday = today.date()
        week_ago = (today - timedelta(days=7)).date()
        _30days_ago = (today - timedelta(days=30)).date()
        ret = [filters.EqualTo("goods_receipt.customer", name=u"是"),
               filters.BiggerThan("create_time", name=u"在", options=[
                   (yesterday, u'一天内'), (week_ago, u'一周内'), (_30days_ago, u'30天内')]),
               category_filter]
        if not SchedulerPermission.can():
            ret.append(only_unfinished_filter)
        return ret
예제 #4
0
파일: views.py 프로젝트: cash2one/lite-mms
 def get_column_filters(self):
     not_paid_default = AccountantPermission.can()
     return [
         filters.EqualTo("customer", name=u"是"),
         filters.Only("is_paid",
                      display_col_name=u"只展示未付款发货单",
                      test=lambda col: col == False,
                      notation=u"is_paid",
                      default_value=not_paid_default),
         filters.Only("MSSQL_ID",
                      display_col_name=u"只展示未导出发货单",
                      test=lambda col: col == None,
                      notation="is_export",
                      default_value=False)
     ]
예제 #5
0
파일: views.py 프로젝트: cash2one/lite-mms
class ProductModelView(AdminModelView):
    """
    产品的管理类
    """
    can_batchly_edit = True
    __list_columns__ = ["id", "MSSQL_ID", "name", "product_type", "enabled"]
    __column_labels__ = {
        "id": u"产品编号",
        "MSSQL_ID": u"在mssql的编号",
        "name": u"名称",
        "product_type": u"产品类型",
        "enabled": u"是否启用"
    }
    __column_formatters__ = {"enabled": lambda v, obj: u"是" if v else u"否"}
    __column_filters__ = [filters.EqualTo("product_type", name=u"是")]
    __batch_form_columns__ = ["product_type", "enabled"]
예제 #6
0
파일: views.py 프로젝트: cash2one/lite-mms
    def __list_filters__(self):

        if AccountantPermission.can():
            return [filters.EqualTo("pay_in_cash", value=True)]
        return []
예제 #7
0
파일: views.py 프로젝트: cash2one/lite-mms
class DeliverySessionModelView(ModelView):
    can_batchly_edit = False
    column_hide_backrefs = False
    edit_template = "delivery/delivery-session.html"
    list_template = "delivery/delivery-session-list.html"

    __sortable_columns__ = ("create_time", "finish_time")

    def get_list_columns(self):
        def gr_item_formatter(v, obj):
            # 格式化每个发货单,未打印或者过期,需要提示出来
            ret = unicode(v)
            if v.pay_in_cash and not v.is_paid:
                ret += u'<small class="text-danger"> (未支付)</small>'
            if not v.MSSQL_ID:
                ret += u'<small class="text-danger"> (未导入)</small>'
            if v.stale:
                ret += u'<small class="text-danger"> (过期)</small>'
            return ret

        return [
            "id", "plate_",
            ColumnSpec("tare",
                       label=u"净重(公斤)",
                       formatter=lambda v, obj: sum(
                           dt.weight for dt in obj.delivery_task_list)),
            "create_time", "finish_time", "with_person", "status",
            ListColumnSpec("customer_list_unwrapped",
                           label=u"客 户",
                           compressed=True),
            ListColumnSpec("consignment_list_unwrapped",
                           label=u"发货单",
                           compressed=True,
                           item_col_spec=ColumnSpec(
                               "", formatter=gr_item_formatter))
        ]

    @login_required
    def try_view(self, processed_objs=None):
        pass

    __column_labels__ = {
        "id": u"编号",
        "plate_": u"车辆",
        "create_time": u"创建时间",
        "tare": u"皮重(公斤)",
        "with_person": u"驾驶室",
        "finish_time": u"结束时间",
        "status": u"状态"
    }

    __column_formatters__ = {
        "status":
        lambda v, obj: constants.delivery.desc_status(v),
        "create_time":
        lambda v, obj: v.strftime("%m月%d日 %H点").decode("utf-8"),
        "finish_time":
        lambda v, obj: v.strftime("%m月%d日 %H点").decode("utf-8") if v else "--",
        "with_person":
        lambda v, obj: u'有人' if v else u'无人',
    }

    from datetime import datetime, timedelta

    today = datetime.today()
    yesterday = today.date()
    week_ago = (today - timedelta(days=7)).date()
    _30days_ago = (today - timedelta(days=30)).date()
    __column_filters__ = [
        filters.BiggerThan("create_time",
                           name=u"在",
                           default_value=str(yesterday),
                           options=[(yesterday, u'一天内'), (week_ago, u'一周内'),
                                    (_30days_ago, u'30天内')]),
        filters.EqualTo("plate_", name=u"是"),
        filters.Only("status",
                     display_col_name=u"仅展示未完成会话",
                     test=lambda col: ~col.in_([
                         constants.delivery.STATUS_CLOSED, constants.delivery.
                         STATUS_DISMISSED
                     ]),
                     notation="__only_unclosed")
    ]

    def get_form_columns(self, obj=None):
        __form_columns__ = OrderedDict()

        __form_columns__[u"发货会话详情"] = [
            ColumnSpec("id"), "plate_", "tare", "with_person",
            ColumnSpec("create_time"),
            ColumnSpec("finish_time"),
            PlaceHolderColumnSpec(col_name="log_list",
                                  label=u"日志",
                                  template_fname="logs-snippet.html")
        ]

        __form_columns__[u"发货任务列表"] = [
            PlaceHolderColumnSpec(
                "delivery_task_list",
                label="",
                template_fname="delivery/delivery-task-list-snippet.html")
        ]

        __form_columns__[u"发货单列表"] = [
            PlaceHolderColumnSpec(
                "consignment_list",
                label="",
                template_fname="delivery/consignment-list-snippet.html")
        ]
        if obj and obj.status not in [
                constants.delivery.STATUS_CLOSED,
                constants.delivery.STATUS_DISMISSED
        ]:
            __form_columns__[u"已选择仓单列表"] = [
                PlaceHolderColumnSpec(
                    "store_bill_list",
                    label="",
                    template_fname="delivery/store-bill-list-snippet.html")
            ]
        return __form_columns__

    __default_order__ = ("create_time", "desc")

    def __list_filters__(self):
        return [filters.NotEqualTo("plate", name=u"", value="foo")]

    def preprocess(self, obj):
        return DeliverySessionWrapper(obj)

    def patch_row_attr(self, idx, obj):
        test = len(obj.customer_list) > len(obj.consignment_list)
        stale = False
        unimported = False
        for cn in obj.consignment_list:
            if not cn.MSSQL_ID:
                unimported = True
            if cn.stale:
                stale = True
        if test or stale:
            return {
                "title": u"有客户发货单没有生成,或者存在已经过期的发货单, 强烈建议您重新生成发货单!",
                "class": "danger"
            }
        elif unimported:
            return {"title": u"有客户发货单未导入", "class": "warning"}

    def get_create_columns(self):
        def filter_plate(q):
            unfinished_us_list = models.UnloadSession.query.filter(
                models.UnloadSession.finish_time == None)
            unfinished_ds_list = models.DeliverySession.query.filter(
                models.DeliverySession.finish_time == None)
            plates = [us.plate for us in unfinished_us_list]
            plates.extend(ds.plate for ds in unfinished_ds_list)
            return q.filter(~models.Plate.name.in_(plates))

        columns = OrderedDict()
        columns[u"基本信息"] = [
            InputColumnSpec("plate_", filter_=filter_plate),
            InputColumnSpec("with_person", label=u"驾驶室是否有人"), "tare"
        ]
        columns[u"已选择仓单列表"] = [
            PlaceHolderColumnSpec(
                "store_bill_list",
                label="",
                template_fname="delivery/store-bill-list-snippet.html",
                as_input=True)
        ]
        return columns

    def get_customized_actions(self, model_list=None):
        from lite_mms.portal.delivery.actions import CloseAction, OpenAction, CreateConsignmentAction, \
            BatchPrintConsignment, DeleteDeliverySession

        action_list = []
        if model_list is None:  # for list
            action_list.extend([
                CloseAction(u"关闭"),
                OpenAction(u"打开"),
                CreateConsignmentAction(u"生成发货单"),
                BatchPrintConsignment(u"打印发货单"),
                DeleteDeliverySession(u"删除")
            ])
        else:
            if len(model_list) == 1:
                if model_list[0].status in [
                        constants.delivery.STATUS_CLOSED,
                        constants.delivery.STATUS_DISMISSED
                ]:
                    action_list.append(OpenAction(u"打开"))
                else:
                    action_list.append(CloseAction(u"关闭"))
                if model_list[0].stale:
                    action_list.append(CreateConsignmentAction(u"生成发货单"))
                if model_list[0].consignment_list:
                    action_list.append(BatchPrintConsignment(u"打印发货单"))
        return action_list

    def try_edit(self, processed_objs=None):
        def _try_edit(obj):
            if obj and obj.finish_time or obj.status in [
                    constants.delivery.STATUS_CLOSED,
                    constants.delivery.STATUS_DISMISSED
            ]:
                raise PermissionDenied

        if isinstance(processed_objs, (list, tuple)):
            for obj_ in processed_objs:
                _try_edit(obj_)
        else:
            _try_edit(processed_objs)

    def edit_hint_message(self, obj, read_only=False):
        if read_only:
            return u"发货会话%s已关闭,不能修改" % obj.id
        else:
            return super(DeliverySessionModelView,
                         self).edit_hint_message(obj, read_only)

    def get_edit_help(self, objs):
        return render_template("delivery/ds-edit-help.html")

    def get_list_help(self):
        return render_template("delivery/ds-list-help.html")
예제 #8
0
class DeductionModelView(ModelView):
    __create_columns__ = ["id", "weight", "work_command", "team", "remark"]

    __list_columns__ = [
        "id", "weight", "work_command", "team", "actor", "create_time",
        "remark"
    ]

    __column_labels__ = {
        "weight": u"重量",
        "work_command": u"工单号",
        "team": u"班组",
        "actor": u"质检员",
        "create_time": u"创建于",
        "remark": u"备注",
    }

    __list_formatters__ = {
        "team": lambda model, v: v.name,
        "weight": lambda model, v: str(v) if v else "" + u'(公斤)',
        "actor": lambda model, v: v.username,
        "create_time": lambda model, v: v.strftime("%Y-%m-%d %H") + u"点",
        "remark": lambda model, v: v or "-",
        "work_command": lambda model, v: v.id if v else "-"
    }
    form_formatters = {
        "work_command": lambda work_command: work_command.id,
        "team": lambda team: team.name,
        "actor": lambda actor: actor.username
    }

    __sortable_columns__ = [
        "id", "weight", "work_command", "team", "actor", "create_time"
    ]

    from flask.ext.databrowser import filters
    from datetime import datetime, timedelta
    today = datetime.today()
    yesterday = today.date()
    week_ago = (today - timedelta(days=7)).date()
    _30days_ago = (today - timedelta(days=30)).date()
    __column_filters__ = [
        filters.EqualTo("team", name=u"是", opt_formatter=lambda opt: opt.name),
        filters.BiggerThan("create_time",
                           name=u"在",
                           options=[(yesterday, u'一天内'), (week_ago, u'一周内'),
                                    (_30days_ago, u'30天内')]),
        filters.EqualTo("id", name=u"是"),
        filters.LessThan("weight", name=u"小于"),
        filters.EqualTo("work_command",
                        name=u"等于",
                        opt_formatter=lambda opt: opt.id)
    ]

    def can_create(self):
        return addDeduction.can()

    def can_edit(self):
        return editDeduction.can()

    def can_delete(self):
        return deleteDeduction.can()

    def on_model_change(self, form, model):
        from flask.ext.login import current_user
        model.actor = current_user
        if not model.create_time:
            model.create_time = datetime.now()
예제 #9
0
파일: views.py 프로젝트: cash2one/lite-mms
class UnloadSessionModelView(ModelView):
    edit_template = "cargo/unload-session.html"

    can_batchly_edit = False

    def try_edit(self, objs=None):
        CargoClerkPermission.test()

        def _try_edit(obj_):
            if obj_ and obj_.finish_time:
                raise PermissionDenied

        if isinstance(objs, (list, tuple)):
            for obj_ in objs:
                _try_edit(obj_)
        else:
            _try_edit(objs)

    def repr_obj(self, obj):
        return unicode(obj) + "(" + cargo_const.desc_status(
            obj.status) + ")" + "<br /><p class='text-center'><small class='muted'>" + '&nbsp;' + ",".join(
            [unicode(customer) for customer in obj.customer_list]) + "</small></p>"

    def get_list_columns(self):
        def gr_item_formatter(v, obj):
            # 格式化每个收货单,未打印或者过期,需要提示出来
            ret = unicode(v)
            v = GoodsReceiptWrapper(v)
            if not v.printed:
                ret += u'<small class="text-danger"> (未打印)</small>'
            if v.stale:
                ret += u'<small class="text-danger"> (过期)</small>'
            return ret

        return ["id", "plate_", "create_time", "finish_time", "with_person", "status",
                ListColumnSpec("customer_list_unwrapped", label=u"客 户", compressed=True),
                ListColumnSpec("goods_receipt_list_unwrapped",
                               label=u"收货单",
                               compressed=True,
                               item_col_spec=ColumnSpec("", formatter=gr_item_formatter))]

    __column_labels__ = {"id": u"编号", "plate_": u"车辆", "create_time": u"创建时间", "finish_time": u"结束时间",
                         "with_person": u"驾驶室", "status": u"状态", "goods_receipt_list": u"收货单", "gross_weight": u"净重"}

    def patch_row_attr(self, idx, obj):
        test = len(obj.customer_list) > len(obj.goods_receipt_list)
        stale = False
        unprinted = False
        for gr in obj.goods_receipt_list:
            if not gr.printed:
                unprinted = True
            if gr.stale:
                stale = True
        if test or stale:
            return {
                "title": u"有客户收货单没有生成,或者存在已经过期的收货单, 强烈建议您重新生成收货单!",
                "class": "danger"}
        elif unprinted:
            return {
                "title": u"有客户收货单没有打印",
                "class": "warning"}

    __column_formatters__ = {
        "create_time": lambda v, obj: v.strftime("%m月%d日 %H点").decode("utf-8"),
        "finish_time": lambda v, obj: v.strftime("%m月%d日 %H点").decode("utf-8") if v else "--",
        "with_person": lambda v, obj: u'有人' if v else u'无人',
        "status": lambda v, obj: cargo_const.desc_status(v),
    }

    __default_order__ = ("id", "desc")

    __sortable_columns__ = ["id", "plate", "create_time", "finish_time"]

    from flask.ext.databrowser import filters
    from datetime import datetime, timedelta

    today = datetime.today()
    yesterday = today.date()
    week_ago = (today - timedelta(days=7)).date()
    _30days_ago = (today - timedelta(days=30)).date()

    __column_filters__ = [filters.BiggerThan("create_time", name=u"在", default_value=str(yesterday),
                                             options=[(yesterday, u'一天内'), (week_ago, u'一周内'),
                                                      (_30days_ago, u'30天内')]),
                          filters.EqualTo("plate_", name=u"是"),
                          filters.Only("status", display_col_name=u"仅展示未完成会话", test=lambda col: ~col.in_(
                              [cargo_const.STATUS_CLOSED, cargo_const.STATUS_DISMISSED]), notation="__only_unclosed"),
    ]

    def try_view(self, processed_objs=None):
        from flask.ext.principal import Permission

        Permission.union(CargoClerkPermission, AdminPermission).test()

    def preprocess(self, model):
        return UnloadSessionWrapper(model)

    def get_customized_actions(self, model_list=None):
        from lite_mms.portal.cargo.actions import (CloseAction, OpenAction,
                                                   CreateReceiptAction, BatchPrintGoodsReceipt,
                                                   DeleteUnloadSessionAction)

        class _PrintGoodsReceipt(BaseAction):
            def op_upon_list(self, objs, model_list):
                obj = objs[0]
                return redirect(url_for("goods_receipt.goods_receipts_batch_print",
                                        id_=",".join([str(gr.id) for gr in obj.goods_receipt_list]), url=request.url))

        action_list = []
        create_action = CreateReceiptAction(u"生成收货单")
        if model_list is None:  # for list
            action_list.extend([CloseAction(u"关闭"), OpenAction(u"打开"),  create_action,
                                DeleteUnloadSessionAction(u"删除", None)])
        else:
            if len(model_list) == 1:
                if model_list[0].status in [cargo_const.STATUS_CLOSED, cargo_const.STATUS_DISMISSED]:
                    action_list.append(OpenAction(u"打开"))
                else:
                    action_list.append(CloseAction(u"关闭"))
                if create_action.test_enabled(model_list[0]) == 0:
                    action_list.append(create_action)
                if model_list[0].goods_receipt_list:
                    action_list.append(_PrintGoodsReceipt(u"打印收货单"))
        return action_list

    def get_list_help(self):
        return render_template("cargo/us-list-help.html")

    # ================= FORM PART ============================
    def get_create_columns(self):
        def filter_plate(q):
            unfinished_us_list = UnloadSession.query.filter(UnloadSession.finish_time == None)
            unfinished_ds_list = DeliverySession.query.filter(DeliverySession.finish_time == None)
            plates = [us.plate for us in unfinished_us_list]
            plates.extend(ds.plate for ds in unfinished_ds_list)
            return q.filter(~Plate.name.in_(plates))
            # return q.filter(
            #    and_(~exists().where(UnloadSession.plate == Plate.name).where(UnloadSession.finish_time == None),
            #         ~exists().where(DeliverySession.finish_time == None).where(DeliverySession.plate == Plate.name)))

        return [InputColumnSpec("plate_", filter_=filter_plate),
                InputColumnSpec("with_person", label=u"驾驶室是否有人"),
                "gross_weight"]

    def edit_hint_message(self, obj, read_only=False):
        if read_only:
            return u"已关闭的卸货会话不能修改"
        else:
            return super(UnloadSessionModelView, self).edit_hint_message(obj, read_only)

    __form_columns__ = OrderedDict()
    __form_columns__[u"详细信息"] = [
        "plate_",
        InputColumnSpec("gross_weight", label=u"毛重"),
        InputColumnSpec("with_person", label=u"驾驶室是否有人"),
        ColumnSpec("status", label=u"状态", formatter=lambda v, obj: cargo_const.desc_status(v)),
        InputColumnSpec("create_time", label=u"创建时间", read_only=True),
        InputColumnSpec("finish_time", label=u"结束时间", read_only=True),
        PlaceHolderColumnSpec(col_name="log_list", label=u"日志", template_fname="logs-snippet.html")
    ]
    __form_columns__[u"收货任务列表"] = [
        PlaceHolderColumnSpec(col_name="task_list", label=u"",
                              template_fname="cargo/unload-task-list-snippet.html")]
    __form_columns__[u"收货单列表"] = [
        PlaceHolderColumnSpec(col_name="goods_receipt_list", label=u"", template_fname="cargo/gr-list-snippet.html")]

    def get_edit_help(self, objs):
        return render_template("cargo/us-edit-help.html")

    def get_create_help(self):
        return render_template("cargo/us-create-help.html")
예제 #10
0
파일: views.py 프로젝트: cash2one/lite-mms
class GoodsReceiptModelView(ModelView):
    edit_template = "cargo/goods-receipt.html"

    can_batchly_edit = True

    __default_order__ = ("create_time", "desc")

    def try_create(self):
        raise PermissionDenied

    def preprocess(self, obj):
        return GoodsReceiptWrapper(obj)

    @login_required
    def try_view(self, processed_objs=None):
        pass

    __sortable_columns__ = ["id", "create_time"]

    __list_columns__ = ["id", "receipt_id", "customer", "unload_session.plate",
                        InputColumnSpec("order", formatter=lambda v, obj: v or "--", label=u"订单"),
                        ColumnSpec("printed", formatter=lambda v, obj: u"是" if v else u"否", label=u"是否打印"),
                        ColumnSpec("stale", formatter=lambda v, obj: u"是" if v else u"否", label=u"是否过时"),
                        ColumnSpec("create_time",
                                   formatter=lambda v, obj: v.strftime("%y年%m月%d日 %H时%M分").decode("utf-8"),
                                   label=u"创建时间"), ColumnSpec("creator"),
                        ListColumnSpec("goods_receipt_entries", label=u"产品", compressed=True,
                                       item_col_spec=ColumnSpec("", formatter=lambda v, obj: unicode(
                                           v.product.product_type) + u"-" + unicode(v.product)))]

    def patch_row_attr(self, idx, obj):
        if obj.stale:
            return {
                "class": "danger",
                "title": u"本收货单已经过时,请回到卸货会话重新生成"
            }
        if not obj.printed:
            return {
                "class": "warning",
                "title": u"本收货单尚未打印"
            }

    from flask.ext.databrowser import filters
    from datetime import datetime, timedelta

    today = datetime.today()
    yesterday = today.date()
    week_ago = (today - timedelta(days=7)).date()
    _30days_ago = (today - timedelta(days=30)).date()

    class NoneOrder(filters.Only):
        def set_sa_criterion(self, q):
            if self.value:
                return q.filter(GoodsReceipt.order == None)
            else:
                return q

    __column_filters__ = [filters.BiggerThan("create_time", name=u"在", default_value=str(yesterday),
                                             options=[(yesterday, u'一天内'), (week_ago, u'一周内'),
                                                      (_30days_ago, u'30天内')]),
                          filters.EqualTo("customer", name=u"是"),
                          filters.Only("printed", display_col_name=u"仅展示未打印收货单", test=lambda col: ~col,
                                       notation="__only_unprinted"),
                          NoneOrder("order", display_col_name=u"仅展示未生成订单", test=None, notation="__none")]

    __form_columns__ = OrderedDict()
    __form_columns__[u"详细信息"] = [
        "receipt_id", "customer", "unload_session.plate",
        ColumnSpec("create_time", label=u"创建时间"),
        ColumnSpec("creator"),
        ColumnSpec("printed", label=u"是否打印",
                   formatter=lambda v,
                                    obj: u"是" if v else u'<span class="text-danger">否</span>'),
        ColumnSpec("stale", label=u"是否过时",
                   formatter=lambda v, obj: u'<span class="text-danger">是</span>' if v else u"否"),
        PlaceHolderColumnSpec("log_list", label=u"日志", template_fname="logs-snippet.html")]

    __form_columns__[u"产品列表"] = [
        TableColumnSpec(
            "goods_receipt_entries", label="", preprocess=lambda obj: GoodsReceiptWrapper(obj),
            col_specs=[
                LinkColumnSpec("id", label=u"编号", anchor=lambda v: v,
                               formatter=lambda v, obj: goods_receipt_entry_view.url_for_object(obj, url=request.url)),
                ColumnSpec("product", label=u"产品"),
                ColumnSpec("product.product_type", label=u"产品类型"),
                ColumnSpec("weight", label=u"净重(公斤)"),
                PlaceHolderColumnSpec(col_name="pic_url", label=u"图片",
                                      template_fname="pic-snippet.html",
                                      form_width_class="col-lg-3")])]

    __column_labels__ = {"receipt_id": u'编 号', "customer": u'客 户', "unload_session.plate": u"车牌号",
                         "printed": u'是否打印', "stale": u"是否过时", "create_time": u"创建时间", "order": u"订 单",
                         "creator": u"创建者"}

    def get_customized_actions(self, objs=None):
        from lite_mms.portal.cargo.actions import PrintGoodsReceipt, BatchPrintGoodsReceipt, CreateOrderAction, \
            CreateExtraOrderAction, ViewOrderAction, DeleteGoodsReceiptAction

        delete_goods_receipt_action = DeleteGoodsReceiptAction(u"删除")
        if not objs:
            if g.request_from_mobile:
                return [delete_goods_receipt_action]
            else:
                return [BatchPrintGoodsReceipt(u"批量打印"), delete_goods_receipt_action]
        else:
            def _get_actions(obj):
                if obj.order:
                    return [ViewOrderAction(u"查看订单")]
                else:
                    _actions = [CreateOrderAction(u"生成计重类型订单"), CreateExtraOrderAction(u"生成计件类型订单")]
                    if not obj.printed:
                        _actions.append(delete_goods_receipt_action)
                    return _actions

            if isinstance(objs, (list, tuple)):
                if len(objs) == 1:
                    actions = _get_actions(objs[0])
                else:
                    actions = []
            else:
                actions = _get_actions(objs)
            if not g.request_from_mobile:
                actions.append(PrintGoodsReceipt(u"打印"))
            return actions

    def try_edit(self, objs=None):
        def _try_edit(obj):
            if obj:
                if isinstance(obj, self.data_browser.db.Model):
                    obj = self.preprocess(obj)
                if obj.stale or obj.order:
                    raise PermissionDenied

        CargoClerkPermission.test()

        if isinstance(objs, (list, tuple)):
            return any(_try_edit(obj) for obj in objs)
        else:
            return _try_edit(objs)

    def edit_hint_message(self, obj, read_only=False):
        if read_only:
            if obj.order:
                return u"已生成订单的收货单不能修改"
            else:
                return u"已过时的收货单不能修改"
        else:
            return super(GoodsReceiptModelView, self).edit_hint_message(obj, read_only)

    def batch_edit_hint_message(self, objs, read_only=False):
        if read_only:
            obj_ids = ",".join([obj.receipt_id for obj in objs])
            for obj in objs:
                if obj.order:
                    return u"收货单%s已生成订单,不能批量修改%s" % (obj.receipt_id, obj_ids)
                elif obj.stale:
                    return u"收货单%s已过时,不能批量修改%s" % (obj.receipt_id, obj_ids)
            else:
                return u"存在不能修改的收货单"
        else:
            return super(GoodsReceiptModelView, self).edit_hint_message(objs, read_only)

    def get_batch_form_columns(self, preprocessed_objs=None):
        return ["customer", "receipt_id", "create_time", "printed"]
예제 #11
0
파일: views.py 프로젝트: cash2one/lite-mms
 def __list_filters__(self):
     return [filters.EqualTo("user_id", value=current_user.id)]
예제 #12
0
파일: views.py 프로젝트: cash2one/lite-mms
 def __list_filters__(self):
     return [
         filters.EqualTo('handler_group_id', value=current_user.group.id),
     ]
예제 #13
0
파일: views.py 프로젝트: cash2one/lite-mms
class WorkCommandView(ModelView):
    __list_columns__ = [
        "id", "sub_order.order.customer_order_number", "department", "team",
        "org_weight", "org_cnt", "sub_order.unit", "urgent",
        "sub_order.returned", "tech_req", "handle_type", "status", "procedure",
        "previous_procedure", "order.goods_receipt.customer"
    ]

    __column_labels__ = {
        "id": u"编号",
        "department": u"车间",
        "team": u"班组",
        "sub_order.unit": u"单位",
        "sub_order.returned": u"退镀",
        "urgent": u"加急",
        "org_weight": u"重量(公斤)",
        "org_cnt": u"数量",
        "handle_type": u"处理类型",
        "tech_req": u"技术要求",
        "status": u"状态",
        "procedure": u"工序",
        "previous_procedure": u"上道工序",
        "sub_order.order.customer_order_number": u"订单编号",
        "sub_order": u"子订单编号",
        "order.goods_receipt.customer": u"客户"
    }

    __default_order__ = ("id", "desc")

    __sortable_columns__ = [
        "sub_order.order.customer_order_number", "urgent", "sub_order.returned"
    ]

    def preprocess(self, obj):
        from lite_mms import apis

        return apis.manufacture.WorkCommandWrapper(obj)

    def patch_row_attr(self, idx, row):
        if row.status != constants.work_command.STATUS_FINISHED and (
                row.urgent or row.sub_order.returned):
            return {"class": "danger", "title": u"退镀或加急"}

    from datetime import datetime, timedelta

    today = datetime.today()
    yesterday = today.date()
    week_ago = (today - timedelta(days=7)).date()
    _30days_ago = (today - timedelta(days=30)).date()

    class In_Filter(filters.BaseFilter):
        __notation__ = "__in_ex"

        def __operator__(self, attr, value):
            return attr.in_(set(value))

    __column_filters__ = [
        In_Filter("status",
                  u"是",
                  options=[i[:2] for i in get_status_list()],
                  display_col_name=u"状态"),
        filters.BiggerThan("create_time",
                           name=u"在",
                           display_col_name=u"创建时间",
                           options=[(yesterday, u'一天内'), (week_ago, u'一周内'),
                                    (_30days_ago, u'30天内')]),
        filters.Contains("sub_order.order.customer_order_number",
                         name=u"包含",
                         display_col_name=u"订单编号"),
        filters.EqualTo("sub_order.order.id", name="", hidden=True),
        filters.Only("urgent",
                     display_col_name=u"只展示加急",
                     test=lambda v: v == True,
                     notation="__urgent"),
        filters.Only("sub_order.returned",
                     display_col_name=u"只展示退镀",
                     test=lambda v: v == True,
                     notation="__returned"),
        filters.EqualTo("department", u"是")
    ]

    f = lambda v, model: u"<span class='text-danger'>是</span>" if v else u"否"

    __column_formatters__ = {
        "status": lambda v, model: get_wc_status_list().get(v)[0],
        "department": lambda v, model: v if v else "",
        "team": lambda v, model: v if v else "",
        "sub_order.returned": f,
        "urgent": f,
        "procedure": lambda v, model: v if v else "",
        "previous_procedure": lambda v, model: v if v else "",
        "handle_type": lambda v, model: get_handle_type_list().get(v, u"未知")
    }

    def repr_obj(self, obj):
        return u"""
        <span>
        %(wc)s - <small>%(customer)s</small>
        <small class='pull-right text-muted'>
        %(datetime)s 
        </small>
        </span> 
        """ % {
            "wc": unicode(obj),
            "customer": obj.order.goods_receipt.customer,
            "datetime": obj.create_time.strftime("%m-%d %H:%M")
        }

    def try_create(self):
        raise PermissionDenied

    @login_required
    def try_view(self, processed_objs=None):
        pass

    def try_edit(self, processed_objs=None):
        SchedulerPermission.test()
        if processed_objs and processed_objs[
                0].status == constants.work_command.STATUS_DISPATCHING:
            return True
        else:
            raise PermissionDenied

    def edit_hint_message(self, obj, read_only=False):
        if read_only:
            if not SchedulerPermission.can():
                return u"无修改订单的权限"
            else:
                return u"工单%d已进入生产流程,不能修改" % obj.id
        else:
            return super(WorkCommandView,
                         self).edit_hint_message(obj, read_only)

    def get_customized_actions(self, processed_objs=None):
        from .actions import schedule_action, retrieve_action

        def _get_status_filter(desc):
            for i in get_status_list():
                if i[1] == desc:
                    return i[0]
            else:
                return None

        if processed_objs:
            if all(
                    schedule_action.test_enabled(obj) == 0
                    for obj in processed_objs):
                return [schedule_action]
            elif all(
                    retrieve_action.test_enabled(obj) == 0
                    for obj in processed_objs):
                return [retrieve_action]
        else:
            if self.__column_filters__[0].value == unicode(
                    _get_status_filter(u"待生产")):
                return [schedule_action]
            elif self.__column_filters__[0].value == unicode(
                    _get_status_filter(u"生产中")):
                return [retrieve_action]
            elif self.__column_filters__[0].has_value:
                return [schedule_action, retrieve_action]
        return []

    def get_form_columns(self, obj=None):

        form_columns = OrderedDict()
        c = column_spec.ColumnSpec("",
                                   formatter=lambda v, obj: u"%s-%s" %
                                   (v.id, v.cause_name) if v else "")

        form_columns[u"工单信息"] = [
            column_spec.ColumnSpec("id"),
            column_spec.ColumnSpec("org_weight"),
            column_spec.ColumnSpec("org_cnt"),
            column_spec.ColumnSpec("sub_order.unit"),
            column_spec.ColumnSpec("sub_order.spec", label=u"规格"),
            column_spec.ColumnSpec("sub_order.type", label=u"型号"), "urgent",
            "sub_order.returned", "tech_req",
            column_spec.ColumnSpec("cause_name", label=u"产生原因"),
            column_spec.ColumnSpec("previous_work_command",
                                   label=u"上级工单",
                                   formatter=lambda v, obj: u"%s-%s" %
                                   (v.id, v.cause_name) if v else ""),
            column_spec.ListColumnSpec("next_work_command_list",
                                       label=u"下级工单",
                                       item_col_spec=c),
            column_spec.PlaceHolderColumnSpec(
                "log_list", label=u"日志", template_fname="logs-snippet.html")
        ]
        form_columns[u"加工信息"] = [
            column_spec.ColumnSpec("department"),
            column_spec.ColumnSpec("team"),
            column_spec.ColumnSpec("procedure"),
            column_spec.ColumnSpec("previous_procedure"),
            column_spec.ColumnSpec("processed_weight", label=u"工序后重量"),
            column_spec.ColumnSpec("processed_cnt", label=u"工序后数量"),
            column_spec.ColumnSpec("status_name", label=u"状态"),
            column_spec.ColumnSpec("completed_time", label=u"生产结束时间"),
            column_spec.ColumnSpec(
                "handle_type",
                label=u"处理类型",
                formatter=lambda v, obj: get_handle_type_list().get(v, u"未知"))
        ]
        if obj and obj.qir_list:
            from lite_mms.apis.quality_inspection import get_QI_result_list
            from lite_mms.portal.quality_inspection.views import qir_model_view

            def result(qir):
                for i in get_QI_result_list():
                    if qir.result == i[0]:
                        status = i[1]
                        break
                else:
                    status = u"未知"
                return u"<a href='%s'>质检单%s%s了%s(公斤)</a>" % (
                    qir_model_view.url_for_object(
                        qir, url=request.url), qir.id, status, qir.weight)

            form_columns[u"质检信息"] = [
                column_spec.ListColumnSpec(
                    "qir_list",
                    label=u"质检结果",
                    formatter=lambda v, obj: [result(qir) for qir in v])
            ]

        form_columns[u"订单信息"] = [
            column_spec.ColumnSpec("sub_order"),
            column_spec.ColumnSpec("sub_order.order", label=u"订单号")
        ]
        return form_columns
예제 #14
0
class QIR(ModelView):
    @login_required
    def try_view(self, processed_objs=None):
        pass

    def try_create(self):
        raise PermissionDenied

    can_batchly_edit = False

    def try_edit(self, processed_objs=None):
        QualityInspectorPermission.test()
        raise PermissionDenied

    def edit_hint_message(self, obj, read_only=False):
        if read_only:
            if QualityInspectorPermission.can():
                return u"质检报告%s不能在浏览器上修改" % obj.id
            else:
                return u"您没有修改质检报告%s的权限" % obj.id
        else:
            return super(QIR, self).edit_hint_message(obj, read_only)

    __default_order__ = ("id", "desc")

    __list_columns__ = [
        "id", "work_command_id", "weight", "quantity",
        column_spec.ColumnSpec("result",
                               label=u"质检结果",
                               formatter=lambda v, obj: get_QI_result(v)),
        column_spec.ColumnSpec("actor", label=u"质检员"),
        column_spec.ImageColumnSpec("pic_url",
                                    label=u"图片",
                                    css_class="img-responsive img-polaroid")
    ]

    __column_labels__ = {
        "id": u"编号",
        "quantity": u"数量",
        "weight": u"重量",
        "work_command_id": u"工单号"
    }

    __form_columns__ = [
        column_spec.ColumnSpec("id"), "weight", "quantity",
        column_spec.ColumnSpec('unit', label=u"单位"),
        column_spec.SelectColumnSpec(col_name="result",
                                     label=u"质检结果",
                                     choices=get_QI_result_list()),
        column_spec.ColumnSpec("work_command", label=u"工单编号"),
        column_spec.ColumnSpec("report_time", label=u"创建时间"),
        column_spec.ColumnSpec("actor", label=u"质检员"),
        column_spec.PlaceHolderColumnSpec("pic_url",
                                          template_fname="pic-snippet.html",
                                          label=u"图片")
    ]

    __column_filters__ = [
        filters.EqualTo("result",
                        display_col_name=u"质检结果",
                        options=get_QI_result_list())
    ]

    def preprocess(self, obj):
        from lite_mms.apis.quality_inspection import QIReportWrapper

        return QIReportWrapper(obj)
예제 #15
0
class StoreBillModelView(ModelView):
    __default_order__ = ("id", "desc")

    __list_columns__ = [
        "id", "customer", "product", "weight", "quantity",
        "sub_order.order.customer_order_number", "qir", "qir.actor", "printed",
        "create_time", "qir.work_command", "harbor"
    ]

    __column_labels__ = {
        "id": u"仓单号",
        "customer": u"客户",
        "product": u"产品",
        "weight": u"重量(公斤)",
        "quantity": u"数量",
        "sub_order.order.customer_order_number": u"订单号",
        "qir": u"质检报告",
        "qir.actor": u"质检员",
        "create_time": u"创建时间",
        "qir.work_command": u"工单号",
        "printed": u"打印",
        "harbor": u"存放点",
        "pic_url": u"图片"
    }

    __column_formatters__ = {
        "printed": lambda v, obj: _printed if v else _unprinted,
        "harbor": lambda v, model: v if v else ""
    }

    def preprocess(self, obj):
        return StoreBillWrapper(obj)

    def try_create(self):
        raise PermissionDenied

    class Undeliveried(filters.Only):
        def set_sa_criterion(self, q):
            if self.value:
                return q.filter(
                    models.StoreBill.delivery_session == None).filter(
                        models.StoreBill.delivery_task == None)
            else:
                return q

        @cached_property
        def attr(self):
            return self.col_name

    __column_filters__ = [
        filters.EqualTo("customer", u"是"),
        filters.Only("printed",
                     display_col_name=u"只展示未打印",
                     test=lambda v: v == False,
                     notation="__only_printed"),
        Undeliveried("undeliveried",
                     display_col_name=u"只展示未发货",
                     test=None,
                     notation="__undeliveried")
    ]

    def try_edit(self, processed_objs=None):
        def _try_edit(obj):
            if obj and obj.delivery_session and obj.delivery_task:
                raise PermissionDenied

        QualityInspectorPermission.test()
        if isinstance(processed_objs, (list, tuple)):
            for obj in processed_objs:
                _try_edit(obj)
        else:
            _try_edit(processed_objs)

    def edit_hint_message(self, obj, read_only=False):
        if read_only:
            if QualityInspectorPermission.can():
                return u"仓单-%s已发货,不能编辑" % obj.id
            else:
                return u"您没有修改的权限"
        else:
            return super(StoreBillModelView,
                         self).edit_hint_message(obj, read_only)

    def get_form_columns(self, obj=None):
        columns = [
            ColumnSpec("id"), "qir.work_command", "customer", "product",
            InputColumnSpec("harbor", validators=[Required(u"不能为空")]), "weight"
        ]
        if obj and not StoreBillWrapper(obj).sub_order.measured_by_weight:
            columns.extend([
                "quantity",
                ColumnSpec("unit", label=u"单位"),
                ColumnSpec("sub_order.spec", label=u"型号"),
                ColumnSpec("sub_order.type", label=u"规格"),
            ])
        columns.extend([
            ColumnSpec("create_time"),
            ColumnSpec("printed",
                       label=u"是否打印",
                       formatter=lambda v, obj: u"是" if v else u"否"),
            ColumnSpec("sub_order.id", label=u"子订单号"),
            "sub_order.order.customer_order_number",
            PlaceHolderColumnSpec("pic_url",
                                  label=u"图片",
                                  template_fname="pic-snippet.html",
                                  form_width_class="col-lg-3"),
            PlaceHolderColumnSpec("log_list",
                                  label=u"日志",
                                  template_fname="logs-snippet.html")
        ])
        return columns

    def get_customized_actions(self, processed_objs=None):
        if QualityInspectorPermission.can():
            from .actions import PreviewPrintAction

            return [PreviewPrintAction(u"打印预览")]
        else:
            return []

    @login_required
    def try_view(self, processed_objs=None):
        pass