Esempio n. 1
0
    def _toFieldValue(self, input):
        if not input:
            return self.context.missing_value

        distribution = self.getDistribution()
        cached_value = self.cached_values.get(input)
        if cached_value:
            return cached_value
        if bool(getFeatureFlag('disclosure.dsp_picker.enabled')):
            try:
                self.context.vocabulary.setDistribution(distribution)
                return self.context.vocabulary.getTermByToken(input).value
            except LookupError:
                raise ConversionError(
                    "Launchpad doesn't know of any source package named"
                    " '%s' in %s." % (input, distribution.displayname))
        # Else the untrusted SPN vocab was used so it needs secondary
        # verification.
        try:
            source = distribution.guessPublishedSourcePackageName(input)
        except NotFoundError:
            try:
                source = self.convertTokensToValues([input])[0]
            except InvalidValue:
                raise ConversionError(
                    "Launchpad doesn't know of any source package named"
                    " '%s' in %s." % (input, distribution.displayname))
        self.cached_values[input] = source
        return source
Esempio n. 2
0
class ImageInputWidget(FileWidget):
    """
    render a inputwidget that displays the current
    image and lets you choose to delete, replace or just
    leave the current image as is.
    """
    _missing = u""


    __call__ = ViewPageTemplateFile("templates/image-widget.pt")

    @property
    def update_action_name(self):
        return self.name + ".up_action"

    @property
    def upload_name(self):
        return self.name.replace(".", "_") + "_file"

    @property
    def imageURL(self):
        return "./file-image/%s" % self.context.__name__

    def empty_field(self):
        return self._data is None

    def _getFieldInput(self, name):
        return self.request.form.get(name, self._missing)

    def _getFormInput(self):
        """extract the input value from the submitted form """
        return (self._getFieldInput(self.update_action_name),
                self._getFieldInput(self.upload_name))


    def _toFieldValue(self, (update_action, upload)):
        """convert the input value to an value suitable for the field.
        Check the update_action if we should leave the data alone,
        delete or replace it.
        """
        if update_action == u"update":
            if upload is None or upload == "":
                if self._data is None:
                    return self.context.missing_value
                else:
                    raise ConversionError(
                        _("Form upload is not a file object"))
            try:
                seek = upload.seek
                read = upload.read
            except AttributeError, e:
                raise ConversionError(
                    _("Form upload is not a file object"), e)
            else:
                seek(0)
                data = read()
                if data or getattr(upload, "filename", ""):
                    return data
                else:
                    return self.context.missing_value
Esempio n. 3
0
class DefaultFileInputWidget(FileWidget):
    '''
    This is the default FileInputWidget implementation, 
    other FileInputWidget types extend this
    '''

    _missing = u""

    @property
    def update_action_name(self):
        return self.name + ".up_action"

    @property
    def upload_name(self):
        return self.name.replace(".", "_") + "_file"

    def empty_field(self):
        return self._data is None

    def _getFieldInput(self, name):
        return self.request.form.get(name, self._missing)

    def _getFormInput(self):
        """extract the input value from the submitted form """
        return (self._getFieldInput(self.update_action_name),
                self._getFieldInput(self.upload_name))

    def _toFieldValue(self, (update_action, upload)):
        """convert the input value to an value suitable for the field.
        Check the update_action if we should leave the data alone,
        delete or replace it.
        """
        if update_action == u"update":
            if upload is None or upload == "":
                if self._data is None:
                    return self.context.missing_value
                else:
                    raise ConversionError(
                        _("Form upload is not a file object"))
            try:
                seek = upload.seek
                read = upload.read
            except AttributeError, e:
                raise ConversionError(_("Form upload is not a file object"), e)
            else:
                seek(0)
                data = read()
                if data or getattr(upload, "filename", ""):
                    return data
                else:
                    return self.context.missing_value
Esempio n. 4
0
class TextDateTimeWidget(TextDateWidget):

    __call__ = ViewPageTemplateFile("templates/text-datetime-widget.pt")

    @property
    def time_name(self):
        return self.name.replace(".", "__") + "__time"

    def hasInput(self):
        return ((self.date_name in self.request.form
                 and self.time_name in self.request.form)
                or (self.name in self.request.form))

    def _hasPartialInput(self):
        return (self.date_name in self.request.form
                or self.time_name in self.request.form)

    def _getFormInput(self):
        """extract the input value from the submitted form """
        if not self.time_name in self.request.form:
            return self._getFieldInput(self.name).split(" ")
        return (self._getFieldInput(self.date_name),
                self._getFieldInput(self.time_name))

    def _toFormValue(self, value):
        """Convert a field value to a string that can be inserted into the form.
        """
        if (value == self.context.missing_value) and self.required:
            value = datetime.datetime.now()
        try:
            return (datetime.datetime.strftime(value, "%Y-%m-%d"),
                    datetime.datetime.strftime(value, "%H:%M"))
        except:
            #log.error("TextDateTimeWidget._toFormValue(%s) FAILED" % (value))
            #debug.log_exc(sys.exc_info(), log_handler=log.error)
            return ("", "12:00")

    def _toFieldValue(self, (date, time)):
        if (date == self._missing or time == self._missing):
            if self.required:
                return self.context.missing_value
            else:
                if date + time == self._missing:
                    return None
                else:
                    return self.context.missing_value
        else:
            try:
                d = datetime.datetime.strptime(date, "%Y-%m-%d")
                t = datetime.datetime.strptime(time, "%H:%M")
                return datetime.datetime(
                    year=d.year,
                    month=d.month,
                    day=d.day,
                    hour=t.hour,
                    minute=t.minute,
                )
            except ValueError, e:
                raise ConversionError(
                    _("Incorrect string data for date and time"), e)
Esempio n. 5
0
 def _toFieldValue(self, input):
     value = super(Bytes, self)._toFieldValue(input)
     if type(value) is unicode:
         try:
             value = value.encode('ascii')
         except UnicodeError, v:
             raise ConversionError(_("Invalid textual data"), v)
Esempio n. 6
0
 def _toFieldValue(self, input):
     if input == self._missing:
         return self.context.missing_value
     else:
         try:
             return float(input)
         except ValueError as v:
             raise ConversionError(_("Invalid floating point data"), v)
Esempio n. 7
0
 def _toFieldValue(self, input):
     if input == self._missing:
         return self.context.missing_value
     else:
         try:
             return int(input)
         except ValueError, v:
             raise ConversionError(_("Invalid integer data"), v)
Esempio n. 8
0
 def _toFieldValue(self, input):
     if input is None or input == '':
         return self.context.missing_value
     try:
         seek = input.seek
         read = input.read
     except AttributeError, e:
         raise ConversionError(_('Form input is not a file object'), e)
Esempio n. 9
0
 def _toFieldValue(self, input):
     if input == self._missing:
         return self.context.missing_value
     else:
         try:
             return decimal.Decimal(input)
         except decimal.InvalidOperation as v:
             raise ConversionError(_("Invalid decimal data"), v)
Esempio n. 10
0
 def _toFieldValue(self, input):
     if not input:
         return self.context.missing_value
     try:
         filename = input.filename.split('\\')[-1]  # for IE
         input.filename = filename.strip().replace(' ', '_')
     except AttributeError, e:
         raise ConversionError(zope_('Form input is not a file object'), e)
Esempio n. 11
0
 def _toFieldValue(self, input):
     if input:
         try:
             return self.convertTokensToValues([input])[0]
         except (InvalidValue, TypeError) as e:
             raise ConversionError(_("Invalid value"), e)
     else:
         return self.context.missing_value
Esempio n. 12
0
 def _toFieldValue(self, input):
     value = super(Bytes, self)._toFieldValue(input)
     if isinstance(value, unicode):
         try:
             value = value.encode('ascii')
         except UnicodeError as v:
             raise ConversionError(_("Invalid textual data"), v)
     return value
Esempio n. 13
0
    def _toFieldValue(self, input):
        if input == self._missing:
            return self.context.missing_value

        try:
            return str(input.strip())
        except (AttributeError, UnicodeEncodeError), err:
            raise ConversionError(_(u'Invalid email address.'), err)
Esempio n. 14
0
 def _toFieldValue(self, value):
     value = super(TextAreaWidget, self)._toFieldValue(value)
     if value:
         try:
             value = unicode(value)
         except ValueError, v:
             raise ConversionError(_("Invalid unicode data"), v)
         else:
             value = value.replace("\r\n", "\n")
Esempio n. 15
0
 def _toFieldValue(self, input):
     """See SimpleInputWidget"""
     if input is None:
         input = []
     elif not isinstance(input, list):
         input = [input]
     try:
         values = self.convertTokensToValues(input)
     except InvalidValue, e:
         raise ConversionError(_("Invalid value"), e)
Esempio n. 16
0
 def _toFieldValue(self, date):
     """convert the input value to an value suitable for the field."""
     if (date == self.context.missing_value) and self.required:
         return self.context.missing_value
     else:
         try:
             return  datetime.datetime.strptime(date, "%Y-%m-%d").date()
         except ValueError, e:
             if date == "":
                 return
             raise ConversionError(_(u"Incorrect string data for date"), e)
Esempio n. 17
0
 def _toFieldValue(self, input):
     if input == self._missing:
         return self.context.missing_value
     else:
         try:
             formatter = self.request.locale.dates.getFormatter(
                 self._category, (self.displayStyle or None))
             return formatter.parse(input)
         except (DateTimeParseError, ValueError) as v:
             raise ConversionError(_("Invalid datetime data"),
                                   "%s (%r)" % (v, input))
Esempio n. 18
0
 def _toFieldValue(self, input):
     if input == self._missing:
         return self.context.missing_value
     else:
         try:
             # TODO: Currently datetimes return in local (server)
             # time zone if no time zone information was given.
             # Maybe offset-naive datetimes should be returned in
             # this case? (DV)
             return parseDatetimetz(input)
         except (DateTimeError, ValueError, IndexError) as v:
             raise ConversionError(_("Invalid datetime data"), v)
Esempio n. 19
0
 def _toFieldValue(self, input):
     if self.convert_missing_value and input == self._missing:
         value = self.context.missing_value
     else:
         # We convert everything to unicode. This might seem a bit crude,
         # but anything contained in a TextWidget should be representable
         # as a string. Note that you always have the choice of overriding
         # the method.
         try:
             value = unicode(input)
         except ValueError, v:
             raise ConversionError(_("Invalid text data"), v)
Esempio n. 20
0
 def _toFieldValue(self, value):
     if self.required and (value == self.context.missing_value):
         return value
     else:
         try:
             parsed = datetime.datetime.strptime(value, "%H:%M")
             return value
         except ValueError, e:
             if value:
                 raise ConversionError(
                     _(u"Type in a valid time value in"
                       " 24H format e.g 00:00 - 23:59"), e)
Esempio n. 21
0
 def _toFieldValue(self, value):
     dates = []
     for token in itertools.chain(
             *[line.split("\n") for line in value.split(",")]):
         token = token.strip()
         if not token:
             continue
         try:
             date = parseDatetimetz(token)
             dates.append(date.date())
         except (DateTimeError, ValueError, IndexError), v:
             raise ConversionError(
                 _("Invalid date: $value", mapping={"value": token}), v)
Esempio n. 22
0
 def _checkSupportedFormat(self, input):
     """Checks that the input is in a usable format."""
     for fmt in self.supported_input_formats:
         try:
             datetime.strptime(input.strip(), fmt)
         except (ValueError) as e:
             if 'unconverted data remains' in str(e):
                 return
             else:
                 failure = e
         else:
             return
     if failure:
         raise ConversionError('Invalid date value', failure)
Esempio n. 23
0
 def _toFieldValue(self, input):
     """See zope.formlib.widget.SimpleInputWidget."""
     if input == self._missing:
         return self.context.missing_value
     else:
         input = input.strip()
         # Bug ids are often prefixed with '#', but getByNameOrID
         # doesn't accept such ids.
         if input.startswith('#'):
             input = input[1:]
         try:
             return getUtility(IBugSet).getByNameOrID(input)
         except (NotFoundError, ValueError):
             raise ConversionError("Not a valid bug number or nickname.")
Esempio n. 24
0
 def _toFieldValue(self, input):
     if input is None or input == '':
         return self.context.missing_value
     try:
         seek = input.seek
         read = input.read
     except AttributeError as e:
         raise ConversionError(_('Form input is not a file object'), e)
     else:
         seek(0)
         data = read()
         if data or getattr(input, 'filename', ''):
             return data
         else:
             return self.context.missing_value
Esempio n. 25
0
    def _parseInput(self, input):
        """Convert a string to a datetime value.

          >>> from zope.publisher.browser import TestRequest
          >>> from zope.schema import Field
          >>> field = Field(__name__='foo', title=u'Foo')
          >>> widget = DateTimeWidget(field, TestRequest())
          >>> widget.required_time_zone = pytz.timezone('UTC')
          >>> widget.time_zone
          <UTC>

        The widget converts an empty string to the missing value:

          >>> widget._parseInput('') == field.missing_value
          True

        The widget prints out times in UTC:

          >>> print widget._parseInput('2006-01-01 12:00:00')
          2006-01-01 12:00:00+00:00

        But it will handle other time zones:

          >>> widget.required_time_zone = pytz.timezone('Australia/Perth')
          >>> print widget._parseInput('2006-01-01 12:00:00')
          2006-01-01 12:00:00+08:00

        Invalid dates result in a ConversionError:

          >>> print widget._parseInput('not a date')  #doctest: +ELLIPSIS
          Traceback (most recent call last):
            ...
          ConversionError: ('Invalid date value', ...)
        """
        if input == self._missing:
            return self.context.missing_value
        self._checkSupportedFormat(input)
        try:
            year, month, day, hour, minute, second, dummy_tz = parse(input)
            second, micro = divmod(second, 1.0)
            micro = round(micro * 1000000)
            dt = datetime(year, month, day,
                          hour, minute, int(second), int(micro))
        except (DateTimeError, ValueError, IndexError) as v:
            raise ConversionError('Invalid date value', v)
        return self.time_zone.localize(dt)
Esempio n. 26
0
    def _toFieldValue(self, input):
        if not input:
            return self.context.missing_value

        distribution = self.getDistribution()
        cached_value = self.cached_values.get(input)
        if cached_value:
            return cached_value
        try:
            source = distribution.guessPublishedSourcePackageName(input)
        except NotFoundError:
            try:
                source = self.convertTokensToValues([input])[0]
            except InvalidValue:
                raise ConversionError(
                    "Launchpad doesn't know of any source package named"
                    " '%s' in %s." % (input, distribution.displayname))
        self.cached_values[input] = source
        return source
Esempio n. 27
0
    def _toFieldValue(self, input):
        """See SimpleInputWidget"""
        if input is None:
            input = []
        elif not isinstance(input, list):
            input = [input]
        try:
            values = self.convertTokensToValues(input)
        except InvalidValue as e:
            raise ConversionError(_("Invalid value"), e)

        # All AbstractCollection fields have a `_type` attribute specifying
        # the type of collection. Use it to generate the correct type,
        # otherwise return a list.  TODO: this breaks encapsulation.
        if hasattr(self.context, '_type'):
            _type = self.context._type
            if isinstance(_type, tuple):
                _type = _type[0]
            return _type(values)
        else:
            return values
Esempio n. 28
0
class SelectDateTimeWidget(SelectDateWidget):

    __call__ = ViewPageTemplateFile("templates/select-datetime-widget.pt")

    @property
    def _hour_name(self):
        return self.name.replace(".", "__") + "__hour"

    @property
    def _minute_name(self):
        return self.name.replace(".", "__") + "__minute"



    def hasInput(self):
        return (super(SelectDateTimeWidget, self).hasInput() and
                    self._hour_name in self.request.form and
                    self._minute_name in self.request.form)
    def _hasPartialInput(self):
        return (super(SelectDateTimeWidget, self)._hasPartialInput() or
            self._hour_name in self.request.form or
            self._minute_name in self.request.form)

    def _getFormInput(self):
        return (super(SelectDateTimeWidget, self)._getFormInput() + 
                    (self._getFieldInput(self._hour_name),
                    self._getFieldInput(self._minute_name)))

    def _hours(self):
        hl = []
        for i in range(0, 24):
            hl.append("%02d" % (i))
        return hl

    def _minutes(self):
        ml = []
        for i in range(0, 60, 5):
            ml.append("%02d" % (i))
        return ml

    def _toFormValue(self, value):
        if value == self.context.missing_value and self.required:
            d = datetime.datetime.now()
            return (d.day, d.month, d.year, d.hour, d.minute)
        else:
            try:
                return (value.day, value.month, value.year,
                    value.hour, value.minute)
            except:
                return ("0", "0", "0", "0", "0")

    def _toFieldValue(self, (day, month, year, hour, minute)):
        if (day == self._missing or
            month == self._missing or
            year == self._missing or
            hour == self._missing or
            minute == self._missing
        ):
            if self.required:
                return self.context.missing_value
            else:
                if day + month + year + hour + minute == self._missing:
                    return None
                else:
                    return self.context.missing_value
        else:
            try:
                time_zone = self.time_zone
                return datetime.datetime(year=int(year), month=int(month),
                    day=int(day), hour=int(hour), minute=int(minute),)
            except ValueError, e:
                raise ConversionError(
                    _(u"Incorrect string data for date and time"), e)
Esempio n. 29
0
class SelectDateWidget(zope.formlib.widget.SimpleInputWidget):
    """A more user freindly date input.
    """
    __call__ = ViewPageTemplateFile("templates/select-date-widget.pt")

    _missing = u""
    minYear = None
    maxYear = None

    minYearDelta = 100
    maxYearDelta = 5

    js_file = open(path + "/templates/yui-calwidget.js", "r")
    js_template = js_file.read()
    js_file.close()

    def __init__(self, *args):
        super(SelectDateWidget, self).__init__(*args)
        need("yui-calendar")
        need("yui-container")
        need("yui-element")
        need("yui-button")
        self.minDate = datetime.date.today() - datetime.timedelta(
            self.minYearDelta * 365)
        self.maxDate = datetime.date.today() + datetime.timedelta(
            self.maxYearDelta * 365)

    @property
    def time_zone(self):
        """Returns something like:
            tzinfo=<DstTzInfo 'Africa/Nairobi' LMT+2:27:00 STD>
        """
        try:
            time_zone = idatetime.ITZInfo(self.request)
        except TypeError:
            time_zone = pytz.UTC
        return time_zone

    @property
    def field_name(self):
        return self.name.replace(".", "__")

    def set_min_date(self, date):
        if date:
            if type(date) == datetime.date:
                self.minDate = date
            elif type(date) == datetime.datetime:
                self.minDate = date.date()
            else:
                self.minDate = (datetime.date.today() - 
                            datetime.timedelta(self.minYearDelta * 365))
        else:
            self.minDate = (datetime.date.today() - 
                    datetime.timedelta(self.minYearDelta * 365))
    def set_max_date(self, date):
        if date:
            if type(date) == datetime.date:
                self.maxDate = date
            elif type(date) == datetime.datetime:
                self.maxDate = date.date()
            else:
                self.maxDate = (datetime.date.today() + 
                        datetime.timedelta(self.maxYearDelta * 365))
        else:
            self.maxDate = (datetime.date.today() + 
                    datetime.timedelta(self.maxYearDelta * 365))

    def jstr(self, alist):
        return u'["' + u'", "'.join(alist) + u'"]'

    def get_js(self):
        pagedate = datetime.date.today()
        if self.maxDate < pagedate:
            pagedate = self.maxDate
        if ((type(self._data) == datetime.date) or
            (type(self._data) == datetime.datetime)
        ):
            pagedate = self._data
        calendar = self.request.locale.dates.calendars["gregorian"]
        month = _(u"Choose Month")
        year = _(u"Enter Year")
        submit = _("OK")
        cancel = _(u"Cancel")
        invalidYear = _(u"Please enter a valid year")
        months_short = self.jstr(calendar.getMonthAbbreviations())
        months_long = self.jstr(calendar.getMonthNames())
        w_day_1char = self.jstr(
            [dn[:1] for dn in calendar.getDayAbbreviations()])
        w_day_short = self.jstr(
            [dn[:2] for dn in calendar.getDayAbbreviations()])
        w_day_medium = self.jstr(calendar.getDayAbbreviations())
        w_day_long = self.jstr(calendar.getDayNames())
        return self.js_template % {
            "name": self.field_name,
            "sel_day": self._day_name,
            "sel_month": self._month_name,
            "sel_year": self._year_name,
            "txt_date": self.date_name,
            "mindate": self.minDate.strftime("%m/%d/%Y"),
            "maxdate": self.maxDate.strftime("%m/%d/%Y"),
            "pagedate": pagedate.strftime("%m/%Y"),
            "months_short": months_short,
            "months_long": months_long,
            "w_day_1char": w_day_1char,
            "w_day_short": w_day_short,
            "w_day_medium": w_day_medium,
            "w_day_long": w_day_long,
            "month": translate(
                str(month), domain="bungeni", context=self.request),
            "year": translate(
                str(year), domain="bungeni", context=self.request),
            "submit": translate(
                str(submit), domain="bungeni", context=self.request),
            "cancel": translate(
                str(cancel), domain="bungeni", context=self.request),
            "invalidYear": translate(
                str(invalidYear), domain="bungeni", context=self.request)
        }

    def _days(self):
        dl = []
        for i in range(1, 32):
            dl.append("%02d" % (i))
        return dl

    def _months(self):
        """ return a dict of month values and names"""
        calendar = self.request.locale.dates.calendars["gregorian"]
        i = 0
        months = []
        for month in  calendar.getMonthNames():
            i = i + 1
            months.append({"num": "%02d" % i, "name": month})
        return months

    @property
    def _years(self):
        minYear = self.minYear
        if self.minDate:
            minYear = self.minDate.year
        if minYear is None:
            minYear = datetime.date.today().year - int(self.minYearDelta)
        maxYear = self.maxYear
        if self.maxDate:
            maxYear = self.maxDate.year
        if maxYear is None:
            maxYear = datetime.date.today().year + int(self.maxYearDelta)
        return range(maxYear, minYear - 1, -1)

    @property
    def _day_name(self):
        return self.name.replace(".", "__") + "__day"

    @property
    def _month_name(self):
        return self.name.replace(".", "__") + "__month"

    @property
    def _year_name(self):
        return self.name.replace(".", "__") + "__year"

    @property
    def date_name(self):
        return self.name.replace(".", "__") + "__date"

    def hasInput(self):
        """Widgets need to determine whether the request contains an input
        value for them """
        return (self._day_name in self.request.form and
                self._month_name in self.request.form and
                self._year_name in self.request.form)

    def _hasPartialInput(self):
        return (self._day_name in self.request.form or
               self._month_name in self.request.form or
               self._year_name in self.request.form)



    def _getFormInput(self):
        """extract the input value from the submitted form """
        return (self._getFieldInput(self._day_name),
                self._getFieldInput(self._month_name),
                self._getFieldInput(self._year_name))


    def _getFieldInput(self, name):
        return self.request.form.get(name, self._missing)

    def _toFieldValue(self, (day, month, year)):
        """convert the input value to an value suitable for the field."""
        if day == self._missing or month == self._missing or year == self._missing:
            if self.required:
                return self.context.missing_value
            else:
                if day + month + year == self._missing:
                    return None
                else:
                    return self.context.missing_value
        else:
            try:
                time_zone = self.time_zone
                return datetime.date(
                    year=int(year), month=int(month), day=int(day)
                ) #tzinfo=time_zone)
            except ValueError, e:
                raise ConversionError(_(u"Incorrect string data for date"), e)
Esempio n. 30
0
                data = read()
                if data or getattr(upload, "filename", ""):
                    return data
                else:
                    return self.context.missing_value
        elif update_action == u"delete":
            return None
        elif update_action == u"add":
            if upload is None or upload == "":
                return None
            else:
                try:
                    seek = upload.seek
                    read = upload.read
                except AttributeError, e:
                    raise ConversionError(
                        _("Form upload is not a file object"), e)
                else:
                    seek(0)
                    data = read()
                    if data or getattr(upload, "filename", ""):
                        return data
                    else:
                        return self.context.missing_value
        else:
            raise NotImplementedError
            return

    def hasInput(self):
        """
        determins if the widget widget has changed
        """