Passed
Push — master ( 10ce0d...03dfc1 )
by Jordi
07:54 queued 03:58
created

bika.lims.browser.idserver.view.IDServerView.flush()   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
# -*- coding: utf-8 -*-
2
#
3
# This file is part of SENAITE.CORE.
4
#
5
# SENAITE.CORE is free software: you can redistribute it and/or modify it under
6
# the terms of the GNU General Public License as published by the Free Software
7
# Foundation, version 2.
8
#
9
# This program is distributed in the hope that it will be useful, but WITHOUT
10
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
12
# details.
13
#
14
# You should have received a copy of the GNU General Public License along with
15
# this program; if not, write to the Free Software Foundation, Inc., 51
16
# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
#
18
# Copyright 2018-2019 by it's authors.
19
# Some rights reserved, see README and LICENSE.
20
21
from bika.lims import api
22
from bika.lims import bikaMessageFactory as _
23
from bika.lims.idserver import get_config
24
from bika.lims.numbergenerator import INumberGenerator
25
from plone import protect
26
from Products.Five import BrowserView
27
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
28
from zope.component import getUtility
29
from zope.interface import Interface
30
from zope.interface import implements
31
32
33
class IIDserverView(Interface):
34
    """IDServerView
35
    """
36
37
38
class IDServerView(BrowserView):
39
    """ This browser view is to house ID Server related functions
40
    """
41
    implements(IIDserverView)
42
    template = ViewPageTemplateFile("templates/numbergenerator.pt")
43
44
    def __init__(self, context, request):
45
        super(BrowserView, self).__init__(context, request)
46
        self.context = context
47
        self.request = request
48
49
    def __call__(self):
50
        protect.CheckAuthenticator(self.request.form)
51
52
        self.portal = api.get_portal()
53
        self.request.set('disable_plone.rightcolumn', 1)
54
        self.request.set('disable_border', 1)
55
56
        # Handle form submit
57
        form = self.request.form
58
        submitted = form.get("submitted", False)
59
60
        # nothing to do here
61
        if not submitted:
62
            return self.template()
63
64
        # Handle "Seed" action
65
        if form.get("seed", False):
66
            seeds = form.get("seeds", {})
67
            for key, value in seeds.items():
68
                value = api.to_int(value, None)
69
                message = ""
70
                if value is None:
71
                    message = _("Could not convert '{}' to an integer"
72
                                .format(value))
73
                elif value == 0:
74
                    del self.storage[key]
75
                    message = _("Removed key {} from storage".format(key))
76
                else:
77
                    self.set_seed(key, value)
78
                    message = _("Seeding key {} to {}".format(key, value))
79
                self.add_status_message(message, "info")
80
81
        return self.template()
82
83
    def get_id_template_for(self, key):
84
        """Get a preview of the next number
85
        """
86
        portal_type = key.split("-")[0]
87
        config = get_config(None, portal_type=portal_type)
88
        return config.get("form", "")
89
90
    @property
91
    def storage(self):
92
        number_generator = getUtility(INumberGenerator)
93
        return number_generator.storage
94
95
    def add_status_message(self, message, level="info"):
96
        """Set a portal status message
97
        """
98
        return self.context.plone_utils.addPortalMessage(message, level)
99
100
    def set_seed(self, key, value):
101
        """Set a number of the number generator
102
        """
103
        number_generator = getUtility(INumberGenerator)
104
        return number_generator.set_number(key, api.to_int(value))
105
106
    def seed(self):
107
        """ Reset the number from which the next generated sequence start.
108
            If you seed at 100, next seed will be 101
109
        """
110
        form = self.request.form
111
        prefix = form.get('prefix', None)
112
        if prefix is None:
113
            return 'No prefix provided'
114
        seed = form.get('seed', None)
115
        if seed is None:
116
            return 'No seed provided'
117
        if not seed.isdigit():
118
            return 'Seed must be a digit'
119
        seed = int(seed)
120
        if seed < 0:
121
            return 'Seed cannot be negative'
122
123
        new_seq = self.set_seed(prefix, seed)
124
        return 'IDServerView: "%s" seeded to %s' % (prefix, new_seq)
125