Esempio n. 1
0
    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
Esempio n. 2
0
                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
Esempio n. 3
0
            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
Esempio n. 4
0
    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;