def new_entry(self): errors = {} response = { 'errors': errors, 'now': datetime.datetime.now(), 'entry_type': '', } post = self.request.POST if 'btn.save' in post: entry_type = post.get('entry_type') start_date_str = post.get('start', '') start_time_str = post.get('start_time', '') start = "%s %s" % ( start_date_str, start_time_str, ) start_date = None typeErrors = errors[entry_type] = {} response['entry_type'] = entry_type if not start: typeErrors['start'] = u"Start date and time is required" if typeErrors: self.request.session.flash( u"Unable to add entry. Please try again", queue='error') return response try: start_date = dateutil.parser.parse(start) except ValueError: typeErrors['start'] = u"Invalid start date or time" if typeErrors: self.request.session.flash( u"Unable to add entry. Please try again", queue='error') return response factory = models.lookup_entry_type(entry_type) if factory is None: self.request.session.flash( u"Invalid entry type - this should not happen", queue='error') return response entries = [] for baby in self.request.context.babies: babyErrors = {} baby_name = baby.__name__ end_date = end = None end_date_str = post.get('%s.end' % baby_name, '') end_time_str = post.get('%s.end_time' % baby_name, '') note = post.get('note', '') if end_time_str: end = "%s %s" % ( end_date_str, end_time_str, ) try: end_date = dateutil.parser.parse(end) except ValueError: babyErrors['%s.end' % baby_name] = u"Invalid end date or time" kwargs = { 'baby': baby, 'start': start_date, 'end': end_date, 'note': note } for key, value in post.items(): if (key.startswith("%s." % baby_name) and key not in kwargs and key not in ('%s.end_time' % baby_name)): # Convert value to correct builtin type based on SQLAlchemy # column spec attr_name = key[len(baby_name) + 1:] attr = getattr(factory, attr_name, None) if attr is None: continue type_ = attr.property.columns[0].type.python_type try: if type_ is datetime.timedelta: value = datetime.timedelta( minutes=int(value or 0)) else: value = type_(value) except ( TypeError, AttributeError, ValueError, ): babyErrors[key] = u"Invalid value" kwargs[attr_name] = value if not babyErrors: entry = factory(**kwargs) entries.append(entry) typeErrors.update(babyErrors) if not typeErrors: session = models.DBSession() for entry in entries: session.add(entry) self.request.session.flash(u"Entry added", queue="success") return HTTPFound(location=resource_path(self.request.context) + '/@@entries') return response
self.request) try: # XXX: This is not very nice - we strip timezone to make naive dates start_date = dateutil.parser.parse(start).replace(tzinfo=None) except ValueError: return error_json(400, "Invalid start date", self.request) if end: try: # XXX: This is not very nice - we strip timezone to make naive dates end_date = dateutil.parser.parse(end).replace(tzinfo=None) except ValueError: return error_json(400, "Invalid end date", self.request) factory = models.lookup_entry_type(entry_type) if factory is None: return error_json(400, u"Unknown entry_type: %s" % entry_type, self.request) kwargs = { 'baby': self.request.context, 'start': start_date, 'end': end_date, 'note': note } for key, value in body.items(): if key not in kwargs and key != 'entry_type': # Convert value to correct builtin type based on SQLAlchemy # column spec
return error_json(400, "JSON object with 'entry_type' and 'start' expected", self.request) try: # XXX: This is not very nice - we strip timezone to make naive dates start_date = dateutil.parser.parse(start).replace(tzinfo=None) except ValueError: return error_json(400, "Invalid start date", self.request) if end: try: # XXX: This is not very nice - we strip timezone to make naive dates end_date = dateutil.parser.parse(end).replace(tzinfo=None) except ValueError: return error_json(400, "Invalid end date", self.request) factory = models.lookup_entry_type(entry_type) if factory is None: return error_json(400, u"Unknown entry_type: %s" % entry_type, self.request) kwargs = { 'baby': self.request.context, 'start': start_date, 'end': end_date, 'note': note } for key, value in body.items(): if key not in kwargs and key != 'entry_type': # Convert value to correct builtin type based on SQLAlchemy # column spec
def new_entry(self): errors = {} response = { 'errors': errors, 'now': datetime.datetime.now(), 'entry_type': '', } post = self.request.POST if 'btn.save' in post: entry_type = post.get('entry_type') start_date_str = post.get('start', '') start_time_str = post.get('start_time', '') start = "%s %s" % (start_date_str, start_time_str,) start_date = None typeErrors = errors[entry_type] = {} response['entry_type'] = entry_type; if not start: typeErrors['start'] = u"Start date and time is required" if typeErrors: self.request.session.flash(u"Unable to add entry. Please try again", queue='error') return response try: start_date = dateutil.parser.parse(start) except ValueError: typeErrors['start'] = u"Invalid start date or time" if typeErrors: self.request.session.flash(u"Unable to add entry. Please try again", queue='error') return response factory = models.lookup_entry_type(entry_type) if factory is None: self.request.session.flash(u"Invalid entry type - this should not happen", queue='error') return response entries = [] for baby in self.request.context.babies: babyErrors = {} baby_name = baby.__name__ end_date = end = None end_date_str = post.get('%s.end' % baby_name, '') end_time_str = post.get('%s.end_time' % baby_name, '') note = post.get('note', '') if end_time_str: end = "%s %s" % (end_date_str, end_time_str,) try: end_date = dateutil.parser.parse(end) except ValueError: babyErrors['%s.end' % baby_name] = u"Invalid end date or time" kwargs = { 'baby': baby, 'start': start_date, 'end': end_date, 'note': note } for key, value in post.items(): if ( key.startswith("%s." % baby_name) and key not in kwargs and key not in ('%s.end_time' % baby_name) ): # Convert value to correct builtin type based on SQLAlchemy # column spec attr_name = key[len(baby_name)+1:] attr = getattr(factory, attr_name, None) if attr is None: continue type_ = attr.property.columns[0].type.python_type try: if type_ is datetime.timedelta: value = datetime.timedelta(minutes=int(value or 0)) else: value = type_(value) except (TypeError,AttributeError, ValueError,): babyErrors[key] = u"Invalid value" kwargs[attr_name] = value if not babyErrors: entry = factory(**kwargs) entries.append(entry) typeErrors.update(babyErrors) if not typeErrors: session = models.DBSession() for entry in entries: session.add(entry) self.request.session.flash(u"Entry added", queue="success") return HTTPFound(location=resource_path(self.request.context) + '/@@entries') return response;