| Total Complexity | 5 |
| Total Lines | 47 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
| 1 | # -*- coding: utf-8 -*- |
||
| 2 | |||
| 3 | from datetime import datetime |
||
| 4 | |||
| 5 | import pytz |
||
| 6 | from plone.app.event.base import default_timezone as current_timezone |
||
| 7 | from senaite.core.schema.fields import BaseField |
||
| 8 | from senaite.core.schema.interfaces import IDatetimeField |
||
| 9 | from zope.interface import implementer |
||
| 10 | from zope.schema import Datetime |
||
| 11 | |||
| 12 | |||
| 13 | @implementer(IDatetimeField) |
||
| 14 | class DatetimeField(Datetime, BaseField): |
||
| 15 | """A field that handles date and time |
||
| 16 | """ |
||
| 17 | |||
| 18 | def set(self, object, value): |
||
| 19 | """Set UID reference |
||
| 20 | |||
| 21 | :param object: the instance of the field |
||
| 22 | :param value: datetime value |
||
| 23 | :type value: datetime |
||
| 24 | """ |
||
| 25 | super(DatetimeField, self).set(object, value) |
||
| 26 | |||
| 27 | def get(self, object): |
||
| 28 | """Get the current date |
||
| 29 | |||
| 30 | :param object: the instance of the field |
||
| 31 | :returns: datetime or None |
||
| 32 | """ |
||
| 33 | value = super(DatetimeField, self).get(object) |
||
| 34 | if not isinstance(value, datetime): |
||
| 35 | return None |
||
| 36 | # append current timezone if timezone naive |
||
| 37 | if value.tzinfo is None: |
||
| 38 | tz = current_timezone() |
||
| 39 | tzinfo = pytz.timezone(tz) |
||
| 40 | value = tzinfo.localize(value) |
||
| 41 | return value |
||
| 42 | |||
| 43 | def _validate(self, value): |
||
| 44 | """Validator when called from form submission |
||
| 45 | """ |
||
| 46 | super(DatetimeField, self)._validate(value) |
||
| 47 |