Example #1
0
def index_admin(request, extra_context=None):
    """
    Display the main admin index page, which lists all of the installed
    apps that have been registered in this site.
    """

    APPS_EXIBIR = {
        'Account': ['User'],
        'Egresso': ['Egresso', 'Formacao'],
        'Empresa': ['Empresa'],
        'Oportunidade': ['Oportunidade'],
        'Curso': ['Curso', 'NivelCurso'],
        'Questionario': ['Questao', 'Questionario']
    }

    app_list = admin_site.get_app_list(request)
    app_list = [app for app in app_list if app['name'] in APPS_EXIBIR]
    
    for app in app_list:
        app_name = app['name']
        app['models'] = [m for m in app['models'] if m['object_name'] in APPS_EXIBIR[app_name]]       

    context = {
        **admin_site.each_context(request),
        'title': admin_site.index_title,
        'app_list': app_list,
        **(extra_context or {}),
    }

    request.current_app = admin_site.name

    return TemplateResponse(request, 'admin/index.html', context)
Example #2
0
def action_import(request, object_id):
    """
    数据导入操作
    :param request:
    :param object_id:
    :return:
    """
    title = _("Are you sure?")
    obj = DataImport.objects.get(id=int(object_id))
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    if request.POST.get("post"):
        obj.action_import(request)
        try:

            messages.success(request, _('data import successfully'))
        except Exception as e:
            messages.error(request, e)

        return HttpResponseRedirect("/admin/basedata/dataimport/%s" % (object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
    )
    request.current_app = site.name

    return TemplateResponse(request, 'admin/invent/stockin/in_confirmation.html', context)
Example #3
0
def action_import(request,object_id):
    """
    数据导入操作
    :param request:
    :param object_id:
    :return:
    """
    title = _("Are you sure?")
    obj = DataImport.objects.get(id=int(object_id))
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    if request.POST.get("post"):
        obj.action_import(request)
        try:

            messages.success(request,_('data import successfully'))
        except Exception as e:
            messages.error(request,e)

        return HttpResponseRedirect("/admin/basedata/dataimport/%s"%(object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
    )
    request.current_app = site.name

    return TemplateResponse(request,'admin/invent/stockin/in_confirmation.html', context)
Example #4
0
def action_init(request,object_id):
    """
    期初入库操作
    :param request:
    :param object_id:
    :return:
    """
    title = _("Are you sure?")
    obj = InitialInventory.objects.get(id=int(object_id))
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    if request.POST.get("post"):
        try:
            obj.init_entry(request)
            messages.success(request,_('check in successfully'))
        except Exception as e:
            messages.error(request,e)

        return HttpResponseRedirect("/admin/invent/initialinventory/%s"%(object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
    )
    request.current_app = site.name

    return TemplateResponse(request,'admin/invent/stockin/in_confirmation.html', context)
Example #5
0
    def alesco_import(self, request):
        """Displays a form prompting user to upload an Excel spreadsheet of
        employee data from Alesco. Temporary measure until database link is
        worked out.
        """
        context = dict(
            site.each_context(request),
            title='Alesco data import'
        )

        if request.method == 'POST':
            form = self.AlescoImportForm(request.POST, request.FILES)
            if form.is_valid():
                upload = request.FILES['spreadsheet']
                # Write the uploaded file to a temp file.
                f = open('/tmp/alesco-data.xlsx', 'w')
                f.write(upload.read())
                f.close()
                alesco_data_import(f.name)
                messages.info(request, 'Spreadsheet uploaded successfully!')
                return redirect('admin:tracking_departmentuser_changelist')
        else:
            form = self.AlescoImportForm()
        context['form'] = form

        return TemplateResponse(request, 'tracking/alesco_import.html', context)
Example #6
0
def pay_action(request,model,object_id):
    title = _("Are you sure?")
    ct = ContentType.objects.get(app_label='selfhelp',model=model)
    obj = ct.get_object_for_this_type(id=int(object_id))
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    if model == 'reimbursement':
        loan = obj.loan
        amount = obj.logout_amount
        if loan and (amount is None or amount< 0):
            messages.error(request,u'您选择了借款单据,但是未正确填写核销金额,请在\'财务信息\'栏目中更正')
            return HttpResponseRedirect("/admin/selfhelp/%s/%s"%(model,object_id))

    if request.POST.get("post"):
        try:
            obj.action_pay(request)
            messages.success(request,_('action successfully'))
        except Exception as e:
            messages.error(request,e)

        return HttpResponseRedirect("/admin/selfhelp/%s/%s"%(model,object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
        action_name=_('pay')
    )
    request.current_app = site.name

    return TemplateResponse(request,'admin/invent/stockin/in_confirmation.html', context)
Example #7
0
def action_init(request, object_id):
    """
    期初入库操作
    :param request:
    :param object_id:
    :return:
    """
    title = _("Are you sure?")
    obj = InitialInventory.objects.get(id=int(object_id))
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    if request.POST.get("post"):
        try:
            obj.init_entry(request)
            messages.success(request, _('check in successfully'))
        except Exception as e:
            messages.error(request, e)

        return HttpResponseRedirect("/admin/invent/initialinventory/%s" %
                                    (object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
    )
    request.current_app = site.name

    return TemplateResponse(request,
                            'admin/invent/stockin/in_confirmation.html',
                            context)
Example #8
0
    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        data.update(site.each_context(self.request))

        UserModel = get_user_model()
        data.setdefault("opts", UserModel._meta)

        return data
def _context_data(data, request=None):
    """
    Add admin global context, for compatibility with Django 1.7
    """
    try:
        return dict(site.each_context(request).items() + data.items())
    except AttributeError:
        return data
Example #10
0
def _context_data(data, request=None):
    """
    Add admin global context, for compatibility with Django 1.7
    """
    try:
        return dict(site.each_context(request).items() + data.items())
    except AttributeError:
        return data
Example #11
0
 def get(self, request):
     context = {
         "title": "Scan QR Code",
         "serializer": QRCodeSerializer(),
         **site.each_context(request)
     }
     return TemplateResponse(
         request,
         'scan_qr_code.html',
         context,
     )
Example #12
0
 def get(self, request):
     try:
         return TemplateResponse(
             request, self.template, {
                 **site.each_context(request),
                 **self.get_extra_context(Context.from_request(request)),
                 'title':
                 self.title,
             })
     except Error as e:
         messages.error(request, e.message)
         return redirect('hub')
Example #13
0
 def get_context_data(self, **kwargs):
     # Call the base implementation first to get a context
     context = super(MainView, self).get_context_data(**kwargs)
     # Add in a QuerySet of all the books
     context['site_title'] = 'DPA'
     context['site_header'] = 'DPA Your Django Personal Accountant'
     site_context = site.each_context()
     context['main_menu'] = site_context['main_menu']
     #context['main_menu'] = { 
     #                        'DPA': reverse('main'), 
     #                        'Commodity': reverse('admin:index'), 
     #                        'Amin': reverse('admin:index'), 
     #                      }
     return context
Example #14
0
def list_reports(request):
    """View that displays a list of available reports for the current admin user."""
    reports_by_model = {
        model._meta.verbose_name_plural: report
        for model, report in get_reports_by_model(request.user).items()
    }

    context = {
        **site.each_context(request),
        'title': 'Reports',
        'reports_by_model': reports_by_model,
    }

    request.current_app = site.name

    return TemplateResponse(request, REPORT_INDEX_TEMPLATE, context)
Example #15
0
 def render_modal_window(self, request, form):
     """
     Render a modal popup window with a select box to edit the form
     """
     opts = self.model._meta
     fieldsets = [(None, {'fields': list(form.fields)})]
     adminForm = AdminForm(form, fieldsets, {}, [])
     context = {
         **default_admin_site.each_context(request),
         'title': form.title,
         'adminform': adminForm,
         'add': False,
         'change': True,
         'save_as': False,
         'has_add_permission': False,
         'has_change_permission': True,
         'opts': opts,
         'root_path': reverse('admin:index'),
         'is_popup': True,
         'app_label': opts.app_label,
         'media': self.media + form.media,
     }
     return TemplateResponse(request, self.change_form_template, context)
Example #16
0
    def alesco_import(self, request):
        """Displays a form prompting user to upload an Excel spreadsheet of
        employee data from Alesco. Temporary measure until database link is
        worked out.
        """
        context = dict(
            site.each_context(request),
            title='Alesco data import'
        )

        if request.method == 'POST':
            form = self.AlescoImportForm(request.POST, request.FILES)
            if form.is_valid():
                upload = request.FILES['spreadsheet']
                # Run the task asynchronously.
                async_task(alesco_data_import, upload)
                messages.info(request, 'Alesco data spreadsheet uploaded successfully; data is now being processed.')
                return redirect('admin:organisation_departmentuser_changelist')
        else:
            form = self.AlescoImportForm()
        context['form'] = form

        return TemplateResponse(request, 'organisation/alesco_import.html', context)
Example #17
0
    def alesco_import(self, request):
        """Displays a form prompting user to upload an Excel spreadsheet of
        employee data from Alesco. Temporary measure until database link is
        worked out.
        """
        context = dict(site.each_context(request), title='Alesco data import')

        if request.method == 'POST':
            form = self.AlescoImportForm(request.POST, request.FILES)
            if form.is_valid():
                upload = request.FILES['spreadsheet']
                # Write the uploaded file to a temp file.
                f = open('/tmp/alesco-data.xlsx', 'w')
                f.write(upload.read())
                f.close()
                alesco_data_import(f.name)
                messages.info(request, 'Spreadsheet uploaded successfully!')
                return redirect('admin:organisation_departmentuser_changelist')
        else:
            form = self.AlescoImportForm()
        context['form'] = form

        return TemplateResponse(request, 'organisation/alesco_import.html',
                                context)
Example #18
0
    def alesco_import(self, request):
        """Displays a form prompting user to upload an Excel spreadsheet of
        employee data from Alesco. Temporary measure until database link is
        worked out.
        """
        context = dict(site.each_context(request), title='Alesco data import')

        if request.method == 'POST':
            form = self.AlescoImportForm(request.POST, request.FILES)
            if form.is_valid():
                upload = request.FILES['spreadsheet']
                # Run the task asynchronously.
                async_task(alesco_data_import, upload)
                messages.info(
                    request,
                    'Alesco data spreadsheet uploaded successfully; data is now being processed.'
                )
                return redirect('admin:organisation_departmentuser_changelist')
        else:
            form = self.AlescoImportForm()
        context['form'] = form

        return TemplateResponse(request, 'organisation/alesco_import.html',
                                context)
 def get_context_data(self, **kwargs):
     context = site.each_context(self.request)
     if hasattr(self, 'title'):
         context['title'] = self.title
     context.update(kwargs)
     return super().get_context_data(**context)
Example #20
0
def start(request, app, model, object_id):
    """

    :param request:
    :return:
    """
    import datetime
    content_type = ContentType.objects.get(app_label=app, model=model)
    obj = content_type.get_object_for_this_type(id=int(object_id))
    title = _("Are you sure?")
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)
    has_workflow = False
    queryset = Modal.objects.filter(
        content_type=content_type,
        end__gt=datetime.date.today()).order_by('-end')
    cnt = queryset.count()
    workflow_modal = None
    next_node = None
    next_users = []
    has_next_user = False
    if cnt > 0:
        has_workflow = True
        workflow_modal = queryset[0]
        query_start_node = workflow_modal.node_set.filter(start=1)
        query_first_node = workflow_modal.node_set.order_by('id')
        if query_start_node.count() > 0:
            next_node = query_start_node[0]
        elif query_first_node.count() > 0:
            next_node = query_first_node[0]
        if next_node:
            next_users = compile_node_handler(request, obj, next_node)
            if len(next_users) > 0:
                has_next_user = True
    else:
        title = _("No workflow model was found")

    try:
        tmp = Instance.objects.get(modal=workflow_modal, object_id=object_id)
        messages.warning(request, _("the object is already in workflow"))
        return HttpResponseRedirect("/admin/%s/%s/%s" %
                                    (app, model, object_id))
    except Exception:
        pass

    if request.POST.get("post"):
        val = request.POST.getlist(SELECTED_CHECKBOX_NAME)
        workflow_inst = Instance.objects.create(modal=workflow_modal,
                                                object_id=object_id,
                                                starter=request.user)
        workflow_inst.current_nodes.add(next_node)
        workflow_inst.save()
        workflow_history = History.objects.create(inst=workflow_inst,
                                                  user=request.user)
        for user in User.objects.filter(id__in=val):
            todo = TodoList.objects.create(inst=workflow_inst,
                                           node=next_node,
                                           user=user,
                                           app_name=app,
                                           model_name=model)
        TodoList.objects.create(inst=workflow_inst,
                                user=request.user,
                                app_name=app,
                                model_name=model,
                                is_read=True,
                                read_time=datetime.datetime.now(),
                                status=True)
        if next_node.status_field and next_node.status_value:
            try:
                setattr(obj, next_node.status_field, next_node.status_value)
                obj.save()
            except Exception:
                pass
        messages.success(request, _('workflow started successfully'))
        return HttpResponseRedirect("/admin/%s/%s/%s" %
                                    (app, model, object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
        has_workflow=has_workflow,
        workflow_modal=workflow_modal,
        next_node=next_node,
        has_next_user=has_next_user,
        next_users=next_users,
        checkbox_name=SELECTED_CHECKBOX_NAME,
    )
    request.current_app = site.name

    return TemplateResponse(
        request, 'default/workflow/workflow_start_confirmation.html', context)
Example #21
0
def approve(request, app, model, object_id, operation):
    """

    :param request:
    :param operation:
    :return:
    """
    if operation not in ('1', '3', '4'):
        messages.warning(request, _("unkown workflow operation"))
        return HttpResponseRedirect("/admin/%s/%s/%s" %
                                    (app, model, object_id))

    import datetime
    import copy
    content_type = ContentType.objects.get(app_label=app, model=model)
    obj = content_type.get_object_for_this_type(id=int(object_id))
    title = _("Are you sure?")
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    has_workflow = False
    queryset = Modal.objects.filter(
        content_type=content_type,
        end__gt=datetime.date.today()).order_by('-end')
    cnt = queryset.count()
    workflow_modal = None
    if cnt > 0:
        workflow_modal = queryset[0]
    else:
        messages.warning(request, _("No workflow model was found"))
        return HttpResponseRedirect("/admin/%s/%s/%s" %
                                    (app, model, object_id))
    workflow_instance = None
    try:
        workflow_instance = Instance.objects.get(modal=workflow_modal,
                                                 object_id=object_id)
    except Exception:
        messages.warning(request, _("please start the workflow first"))
        return HttpResponseRedirect("/admin/%s/%s/%s" %
                                    (app, model, object_id))

    next_nodes = []
    node_users = []
    is_stop_node = False
    node_has_users = False
    delete_instance = False
    deny_to_first = False
    next_node_description = None
    all_nodes = [
        x for x in Node.objects.filter(modal=workflow_modal).order_by('-id')
    ]
    current = workflow_instance.current_nodes.all()
    current_tmp = copy.deepcopy(current[0])
    if operation == '4' or operation == '3':
        next_nodes = ['stop']
        is_stop_node = True
    else:
        if current.count() > 1:
            pass
        else:
            tmp_node = current[0]
            if tmp_node.stop or tmp_node == all_nodes[0]:
                next_nodes = ['stop']
                is_stop_node = True
            else:
                if tmp_node.next_node_handler and len(
                        tmp_node.next_node_handler) > 0:
                    hd = tmp_node.next_node_handler
                    klass = NextNodeManager().handlers.get(hd)
                    if klass and isinstance(klass, NextNodeHandler):
                        next_nodes = klass.handle(request, obj, tmp_node)
                        next_node_description = klass.description
                if next_nodes and len(next_nodes) > 0:
                    pass
                elif tmp_node.next and tmp_node.next.count() > 0:
                    next_nodes = [nd for nd in tmp_node.next.all()]
                else:
                    position = all_nodes.index(tmp_node)
                    next_nodes = [all_nodes[position - 1]]

    if request.POST.get("post"):
        from django.db import transaction
        val = request.POST.getlist(SELECTED_CHECKBOX_NAME)
        memo = request.POST['memo']
        with transaction.atomic():
            try:
                if delete_instance:
                    workflow_instance.delete()
                else:
                    if is_stop_node:
                        workflow_instance.status = 99
                        if operation in ('3', '4'):
                            workflow_instance.status = int(operation)
                        if not workflow_instance.approved_time and operation == '1':
                            workflow_instance.approved_time = datetime.datetime.now(
                            )
                        workflow_instance.current_nodes.clear()
                        workflow_instance.save()
                    else:
                        workflow_instance.current_nodes.clear()
                        workflow_instance.current_nodes.add(next_nodes[0])
                        for user in User.objects.filter(id__in=val):
                            todo = TodoList.objects.create(
                                inst=workflow_instance,
                                node=next_nodes[0],
                                user=user,
                                app_name=app,
                                model_name=model)
                        if current_tmp.status_field and current_tmp.status_value:
                            try:
                                setattr(obj, current_tmp.status_field,
                                        current_tmp.status_value)
                                obj.save()
                            except Exception:
                                pass
                    History.objects.create(inst=workflow_instance,
                                           user=request.user,
                                           pro_type=int(operation),
                                           memo=memo,
                                           node=current_tmp)
                    TodoList.objects.filter(inst=workflow_instance,
                                            node=current_tmp,
                                            status=0).update(status=1)
                messages.success(request, _('workflow approved successfully'))
            except Exception as e:
                messages.error(request, e)
                pass
            if current_tmp.action and len(current_tmp.action) > 0:
                action = WorkflowActionManager().actions.get(
                    current_tmp.action)
                if action and isinstance(action, WorkflowAction):
                    action.action(request, obj, current_tmp, operation)

        return HttpResponseRedirect("/admin/%s/%s/%s" %
                                    (app, model, object_id))

    if len(next_nodes) > 0 and not is_stop_node and operation == '1':
        for node in next_nodes:
            users = compile_node_handler(request, obj, node)
            if len(users) > 0:
                node_has_users = True
            node_users.append({'node': node, 'users': users})

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
        operation=operation,
        is_stop_node=is_stop_node,
        delete_instance=delete_instance,
        node_users=node_users,
        node_has_users=node_has_users,
        checkbox_name=SELECTED_CHECKBOX_NAME,
    )
    if next_node_description:
        context.update(dict(next_node_description=next_node_description))
    return TemplateResponse(
        request, "default/workflow/workflow_approve_confirmation.html",
        context)
Example #22
0
    title = _("Are you sure?")
    obj = StockIn.objects.get(id=int(object_id))
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    if request.POST.get("post"):
        try:
            obj.action_entry(request)
            messages.success(request,_('check in successfully'))
        except Exception,e:
            messages.error(request,e)

        return HttpResponseRedirect("/admin/invent/stockin/%s"%(object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
    )
    request.current_app = site.name

    return TemplateResponse(request,'admin/invent/stockin/in_confirmation.html', context)


def action_out(request,object_id):
    """
    出库操作
    :param request:
    :param object_id:
Example #23
0
                                model_name=model,
                                is_read=True,
                                read_time=datetime.datetime.now(),
                                status=True)
        if next_node.status_field and next_node.status_value:
            try:
                setattr(obj, next_node.status_field, next_node.status_value)
                obj.save()
            except Exception, e:
                pass
        messages.success(request, _('workflow started successfully'))
        return HttpResponseRedirect("/admin/%s/%s/%s" %
                                    (app, model, object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
        has_workflow=has_workflow,
        workflow_modal=workflow_modal,
        next_node=next_node,
        has_next_user=has_next_user,
        next_users=next_users,
        checkbox_name=SELECTED_CHECKBOX_NAME,
    )
    request.current_app = site.name

    return TemplateResponse(
        request, 'default/workflow/workflow_start_confirmation.html', context)
Example #24
0
def index(peticion):
    sitio=site.each_context(peticion)
    contexto={
        "url_admin":sitio
    }
    return render (peticion, "index/base.html", contexto)
Example #25
0
from basedata.models import DataImport
from django.utils.translation import ugettext_lazy as _


def action_import(request, object_id):
    """
    数据导入操作
    :param request:
    :param object_id:
    :return:
    """
    title = _("Are you sure?")
    obj = DataImport.objects.get(id=int(object_id))
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    if request.POST.get("post"):
        obj.action_import(request)
        try:

            messages.success(request, _("data import successfully"))
        except Exception, e:
            messages.error(request, e)

        return HttpResponseRedirect("/admin/basedata/dataimport/%s" % (object_id))

    context = dict(site.each_context(request), title=title, opts=opts, objects_name=objects_name, object=obj)
    request.current_app = site.name

    return TemplateResponse(request, "admin/invent/stockin/in_confirmation.html", context)
Example #26
0
def send_member_activation_emails(request):

    # include the django admin context for the member links
    context = site.each_context(request)

    # populate the form with the email settings in case this is a GET
    email_settings = EmailSettings.get_solo()
    form = SendMemberActivationEmailsForm(instance=email_settings)

    # if a valid post...
    if request.method == 'POST':
        form = SendMemberActivationEmailsForm(request.POST)
        if form.is_valid():
            try:

                # update the email settings
                if not ('cancel' in request.POST):
                    email_settings.test_email_address = form.cleaned_data[
                        'test_email_address']
                    email_settings.send_count = form.cleaned_data['send_count']
                    email_settings.is_active = form.cleaned_data['is_active']
                    email_settings.activation_email = form.cleaned_data[
                        'activation_email']
                    email_settings.save()

                # if there is an activation email set...
                if email_settings.activation_email:

                    # send the activation email to the test address
                    if 'send_test' in request.POST:
                        sent = email_settings.activation_email.send_test(
                            request)
                        messages.info(
                            request, "%d member%s emailed" %
                            (sent, 's' if sent != 1 else ''))

                    # send the activation email to uninvited members
                    if 'send_to_count_uninvited' in request.POST:
                        sent = email_settings.activation_email.send_to_count_uninvited(
                            request)
                        messages.info(
                            request, "%d member%s emailed" %
                            (sent, 's' if sent != 1 else ''))

                    # send the activation email to targeted members
                    if 'send_to_count_targeted' in request.POST:
                        sent = email_settings.activation_email.send_to_count_targeted(
                            request)
                        messages.info(
                            request, "%d member%s emailed" %
                            (sent, 's' if sent != 1 else ''))

                    # send the activation email to inactive members
                    if 'send' in request.POST:
                        sent = email_settings.activation_email.send_to_inactive_members(
                            request)
                        messages.info(
                            request, "%d member%s emailed" %
                            (sent, 's' if sent != 1 else ''))

            except Exception as e:
                messages.error(request, repr(e))

        # redirect
        return HttpResponseRedirect(
            reverse('membersadmin:send_member_activation_emails'))

    # add the form to the context
    context['form'] = form

    # render the page
    return render(request, 'admin/send_member_activation_emails.html', context)
Example #27
0
 def get_context_data(self, **kwargs):
     context = site.each_context(self.request)
     if hasattr(self, 'title'):
         context['title'] = self.title
     context.update(kwargs)
     return super().get_context_data(**context)
Example #28
0
def start(request,app,model,object_id):
    """

    :param request:
    :return:
    """
    import datetime
    content_type = ContentType.objects.get(app_label=app,model=model)
    obj = content_type.get_object_for_this_type(id=int(object_id))
    title = _("Are you sure?")
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)
    has_workflow = False
    queryset = Modal.objects.filter(content_type=content_type,end__gt=datetime.date.today()).order_by('-end')
    cnt = queryset.count()
    workflow_modal = None
    next_node = None
    next_users = []
    has_next_user = False
    if cnt > 0:
        has_workflow = True
        workflow_modal = queryset[0]
        query_start_node = workflow_modal.node_set.filter(start=1)
        query_first_node = workflow_modal.node_set.order_by('id')
        if query_start_node.count() > 0:
            next_node = query_start_node[0]
        elif query_first_node.count()>0:
            next_node = query_first_node[0]
        if next_node:
            next_users = compile_node_handler(request,obj,next_node)
            if len(next_users) > 0:
                has_next_user = True
    else:
        title = _("No workflow model was found")

    try:
        tmp = Instance.objects.get(modal = workflow_modal,object_id=object_id)
        messages.warning(request,_("the object is already in workflow"))
        return HttpResponseRedirect("/admin/%s/%s/%s"%(app,model,object_id))
    except Exception:
        pass

    if request.POST.get("post"):
        val = request.POST.getlist(SELECTED_CHECKBOX_NAME)
        workflow_inst = Instance.objects.create(modal=workflow_modal,object_id=object_id,starter=request.user)
        workflow_inst.current_nodes.add(next_node)
        workflow_inst.save()
        workflow_history = History.objects.create(inst=workflow_inst,user=request.user)
        for user in User.objects.filter(id__in=val):
            todo = TodoList.objects.create(inst=workflow_inst,node=next_node,user=user,app_name=app,model_name=model)
        TodoList.objects.create(inst=workflow_inst,user=request.user,app_name=app,model_name=model,is_read=True,
                                read_time=datetime.datetime.now(),status=True)
        if next_node.status_field and next_node.status_value:
            try:
                setattr(obj,next_node.status_field,next_node.status_value)
                obj.save()
            except Exception as e:
                pass
        messages.success(request,_('workflow started successfully'))
        return HttpResponseRedirect("/admin/%s/%s/%s"%(app,model,object_id))

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
        has_workflow = has_workflow,
        workflow_modal = workflow_modal,
        next_node = next_node,
        has_next_user = has_next_user,
        next_users = next_users,
        checkbox_name = SELECTED_CHECKBOX_NAME,
    )
    request.current_app = site.name

    return TemplateResponse(request,'default/workflow/workflow_start_confirmation.html', context)
Example #29
0
def approve(request,app,model,object_id,operation):
    """

    :param request:
    :param operation:
    :return:
    """
    if operation not in ('1','3','4'):
        messages.warning(request,_("unkown workflow operation"))
        return HttpResponseRedirect("/admin/%s/%s/%s"%(app,model,object_id))

    import datetime
    import copy
    content_type = ContentType.objects.get(app_label=app,model=model)
    obj = content_type.get_object_for_this_type(id=int(object_id))
    title = _("Are you sure?")
    opts = obj._meta
    objects_name = force_text(opts.verbose_name)

    has_workflow = False
    queryset = Modal.objects.filter(content_type=content_type,end__gt=datetime.date.today()).order_by('-end')
    cnt = queryset.count()
    workflow_modal = None
    if cnt > 0:
        workflow_modal = queryset[0]
    else:
        messages.warning(request,_("No workflow model was found"))
        return HttpResponseRedirect("/admin/%s/%s/%s"%(app,model,object_id))
    workflow_instance = None
    try:
        workflow_instance = Instance.objects.get(modal = workflow_modal,object_id=object_id)
    except Exception:
        messages.warning(request,_("please start the workflow first"))
        return HttpResponseRedirect("/admin/%s/%s/%s"%(app,model,object_id))

    next_nodes = []
    node_users = []
    is_stop_node = False
    node_has_users = False
    delete_instance = False
    deny_to_first = False
    next_node_description = None
    all_nodes =[x for x in Node.objects.filter(modal=workflow_modal).order_by('-id')]
    current = workflow_instance.current_nodes.all()
    current_tmp = copy.deepcopy(current[0])
    if operation == '4' or operation == '3':
        next_nodes = ['stop']
        is_stop_node = True
    else:
        if current.count() > 1:
            pass
        else:
            tmp_node = current[0]
            if tmp_node.stop or tmp_node == all_nodes[0]:
                next_nodes = ['stop']
                is_stop_node = True
            else:
                if tmp_node.next_node_handler and len(tmp_node.next_node_handler) > 0:
                    hd = tmp_node.next_node_handler
                    klass = NextNodeManager().handlers.get(hd)
                    if klass and isinstance(klass,NextNodeHandler):
                        next_nodes = klass.handle(request,obj,tmp_node)
                        next_node_description = klass.description
                if next_nodes and len(next_nodes) > 0:
                    pass
                elif tmp_node.next and tmp_node.next.count()>0:
                    next_nodes = [nd for nd in tmp_node.next.all()]
                else:
                    position = all_nodes.index(tmp_node)
                    next_nodes = [all_nodes[position-1]]

    if request.POST.get("post"):
        from django.db import transaction
        val = request.POST.getlist(SELECTED_CHECKBOX_NAME)
        memo = request.POST['memo']
        with transaction.atomic():
            try:
                if delete_instance:
                    workflow_instance.delete()
                else:
                    if is_stop_node:
                        workflow_instance.status = 99
                        if operation in ('3', '4'):
                            workflow_instance.status = int(operation)
                        if not workflow_instance.approved_time and operation == '1':
                            workflow_instance.approved_time = datetime.datetime.now()
                        workflow_instance.current_nodes.clear()
                        workflow_instance.save()
                    else:
                        workflow_instance.current_nodes.clear()
                        workflow_instance.current_nodes.add(next_nodes[0])
                        for user in User.objects.filter(id__in=val):
                            todo = TodoList.objects.create(inst=workflow_instance,node=next_nodes[0],user=user,app_name=app,model_name=model)
                        if current_tmp.status_field and current_tmp.status_value:
                            try:
                                setattr(obj,current_tmp.status_field,current_tmp.status_value)
                                obj.save()
                            except Exception as e:
                                pass
                    History.objects.create(inst=workflow_instance,user=request.user,pro_type=int(operation),memo=memo,node=current_tmp)
                    TodoList.objects.filter(inst=workflow_instance,node=current_tmp,status=0).update(status=1)
                messages.success(request,_('workflow approved successfully'))
            except Exception as e:
                messages.error(request,e)
                pass
            if current_tmp.action and len(current_tmp.action) > 0:
                action = WorkflowActionManager().actions.get(current_tmp.action)
                if action and isinstance(action,WorkflowAction):
                    action.action(request,obj,current_tmp,operation)

        return HttpResponseRedirect("/admin/%s/%s/%s"%(app,model,object_id))

    if len(next_nodes) > 0 and not is_stop_node and operation == '1':
        for node in next_nodes:
            users = compile_node_handler(request,obj,node)
            if len(users) > 0:
                node_has_users = True
            node_users.append({'node':node,'users':users})

    context = dict(
        site.each_context(request),
        title=title,
        opts=opts,
        objects_name=objects_name,
        object=obj,
        operation = operation,
        is_stop_node = is_stop_node,
        delete_instance = delete_instance,
        node_users = node_users,
        node_has_users = node_has_users,
        checkbox_name = SELECTED_CHECKBOX_NAME,
    )
    if next_node_description:
        context.update(dict(next_node_description=next_node_description))
    return TemplateResponse(request,"default/workflow/workflow_approve_confirmation.html",context)
Example #30
0
    if model == 'reimbursement':
        loan = obj.loan
        amount = obj.logout_amount
        if loan and (amount is None or amount < 0):
            messages.error(request, u'您选择了借款单据,但是未正确填写核销金额,请在\'财务信息\'栏目中更正')
            return HttpResponseRedirect("/admin/selfhelp/%s/%s" %
                                        (model, object_id))

    if request.POST.get("post"):
        try:
            obj.action_pay(request)
            messages.success(request, _('action successfully'))
        except Exception, e:
            messages.error(request, e)

        return HttpResponseRedirect("/admin/selfhelp/%s/%s" %
                                    (model, object_id))

    context = dict(site.each_context(request),
                   title=title,
                   opts=opts,
                   objects_name=objects_name,
                   object=obj,
                   action_name=_('pay'))
    request.current_app = site.name

    return TemplateResponse(request,
                            'admin/invent/stockin/in_confirmation.html',
                            context)