Passed
Push — 2.x ( 2d6cc3...84f108 )
by Jordi
06:01
created

senaite.core.schema.datetimefield   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 54
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 8
eloc 26
dl 0
loc 54
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A DatetimeField.set() 0 14 2
A DatetimeField.get() 0 10 2
A DatetimeField._validate() 0 4 1

1 Function

Rating   Name   Duplication   Size   Complexity  
A localize() 0 7 3
1
# -*- coding: utf-8 -*-
2
3
from senaite.core.api import dtime
4
from senaite.core.schema.fields import BaseField
5
from senaite.core.schema.interfaces import IDatetimeField
6
from zope.interface import implementer
7
from zope.schema import Datetime
8
9
10
def localize(dt, fallback="UTC"):
11
    if dtime.is_timezone_naive(dt):
12
        zone = dtime.get_os_timezone()
13
        if not zone:
14
            zone = fallback
15
        dt = dtime.to_zone(dt, zone)
16
    return dt
17
18
19
@implementer(IDatetimeField)
20
class DatetimeField(Datetime, BaseField):
21
    """A field that handles date and time
22
    """
23
24
    def set(self, object, value):
25
        """Set datetime value
26
27
28
        NOTE: we need to ensure timzone aware datetime values,
29
              so that also API calls work
30
31
        :param object: the instance of the field
32
        :param value: datetime value
33
        :type value: datetime
34
        """
35
        if dtime.is_dt(value):
36
            value = localize(value)
37
        super(DatetimeField, self).set(object, value)
38
39
    def get(self, object):
40
        """Get the current date
41
42
        :param object: the instance of the field
43
        :returns: datetime or None
44
        """
45
        value = super(DatetimeField, self).get(object)
46
        if not dtime.is_dt(value):
47
            return None
48
        return localize(value)
49
50
    def _validate(self, value):
51
        """Validator when called from form submission
52
        """
53
        super(DatetimeField, self)._validate(value)
54