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/imagewidget.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
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)
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)
class TextDateTimeWidget(TextDateWidget): __call__ = ViewPageTemplateFile("templates/textdatetimewidget.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) 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 """ 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: d = datetime.datetime.now() return (datetime.datetime.strftime(d, "%Y-%m-%d"), datetime.datetime.strftime(d, "%H:%M")) else: try: return (datetime.datetime.strftime(value, "%Y-%m-%d"), datetime.datetime.strftime(value, "%H:%M")) except: return ("", "") 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( _(u"Incorrect string data for date and time"), e)
def _toFieldValue(self, input): """Check whether the confirmation field value is identical to the password value. """ formdata = self.request.form if input != formdata[self.name + '.confirm']: raise ConversionError(_(u"Supplied passwords are not identical"), '') return super(PasswordConfirmationWidget, self)._toFieldValue(input)
def _getFormInput(self): prefix = self.name + '.' year = int(self.request.form.get(prefix + self.elements[2][1], None)) month = int(self.request.form.get(prefix + self.elements[1][1], None)) day = int(self.request.form.get(prefix + self.elements[0][1], None)) if year and month and day: try: return datetime.date(year, month, day) except ValueError, v: raise ConversionError(_("Invalid datetime data"), v)
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)
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)
def _toFieldValue(self, input): # Captcha validation is one-time process to prevent hacking # This is the reason for in-line validation to be disabled. if inline_validation and detectInlineValidation(inline_validation): return super(CaptchaWidget, self)._toFieldValue(input) # Verify the user input against the captcha. # Get captcha type (static or dynamic) google_dict = {'secret': self.get_site().getProperty('RECAPTCHA_SECRET')} google_dict['response'] = self.request.form['g-recaptcha-response'] # google_dict['remoteip'] = self.request.environ["HTTP_X_FORWARDED_FOR"] url = 'https://www.google.com/recaptcha/api/siteverify' data = urllib.urlencode(google_dict) req = urllib2.Request(url, data) recaptcha_value = urllib2.urlopen(req) json_result = json.loads(recaptcha_value.read()) if not json_result['success']: message = _('Invalid captcha value') return ConversionError(message) return 'ok'
class SelectDateTimeWidget(SelectDateWidget): __call__ = ViewPageTemplateFile("templates/selectdatetimewidget.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)
class SelectDateWidget(zope.app.form.browser.widget.SimpleInputWidget): """A more user freindly date input. """ __call__ = ViewPageTemplateFile("templates/selectdatewidget.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)
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 """
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 """