Passed
Push — master ( 804009...22e421 )
by Jordi
09:24
created

IDServerView.to_int()   A

Complexity

Conditions 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 2
nop 3
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
        # Handle "Flush" action
82
        if form.get("flush", False):
83
            message = _("Flushed Number Storage")
84
            self.add_status_message(message, "warning")
85
            self.flush()
86
            return self.template()
87
88
        return self.template()
89
90
    def get_id_template_for(self, key):
91
        """Get a preview of the next number
92
        """
93
        portal_type = key.split("-")[0]
94
        config = get_config(None, portal_type=portal_type)
95
        return config.get("form", "")
96
97
    @property
98
    def storage(self):
99
        number_generator = getUtility(INumberGenerator)
100
        return number_generator.storage
101
102
    def add_status_message(self, message, level="info"):
103
        """Set a portal status message
104
        """
105
        return self.context.plone_utils.addPortalMessage(message, level)
106
107
    def set_seed(self, key, value):
108
        """Set a number of the number generator
109
        """
110
        number_generator = getUtility(INumberGenerator)
111
        return number_generator.set_number(key, api.to_int(value))
112
113
    def seed(self):
114
        """ Reset the number from which the next generated sequence start.
115
            If you seed at 100, next seed will be 101
116
        """
117
        form = self.request.form
118
        prefix = form.get('prefix', None)
119
        if prefix is None:
120
            return 'No prefix provided'
121
        seed = form.get('seed', None)
122
        if seed is None:
123
            return 'No seed provided'
124
        if not seed.isdigit():
125
            return 'Seed must be a digit'
126
        seed = int(seed)
127
        if seed < 0:
128
            return 'Seed cannot be negative'
129
130
        new_seq = self.set_seed(prefix, seed)
131
        return 'IDServerView: "%s" seeded to %s' % (prefix, new_seq)
132
133
    def flush(self):
134
        """ Flush the storage
135
        """
136
        number_generator = getUtility(INumberGenerator)
137
        number_generator.flush()
138
        return "IDServerView: Number storage flushed!"
139