Example #1
0
 def test_from_gtlt(self):
     from repoze.catalog.query import Ge
     from repoze.catalog.query import Le
     gt = Ge('index', 0)
     lt = Le('index', 5)
     inst = self._getTargetClass().fromGTLT(gt, lt)
     self.assertEqual(str(inst), "0 <= index <= 5")
Example #2
0
 def rules(self, context, date=None, user='', group=''):
     context_uid = uuid.UUID(IUUID(context))
     query = Eq('context_uid', context_uid) & Eq('category', self.category)
     if date is not None:
         query = query & Le('valid_from', date) & Ge('valid_to', date)
     if self.for_attribute == FOR_USER:
         if group:
             msg = u'``group`` keyword must not be given if scope is user'
             raise ValueError(msg)
         if user:
             query = query & Eq('user', user)
         else:
             query = query & NotEq('user', '')
     elif self.for_attribute == FOR_GROUP:
         if user:
             msg = u'``user`` keyword must not be given if scope is group'
             raise ValueError(msg)
         if group:
             query = query & Eq('group', group)
         else:
             query = query & NotEq('group', '')
     else:
         if user or group:
             msg = u'``user`` and ``group`` keywords must not be given ' +\
                   u'if scope is general'
             raise ValueError(msg)
         query = query & Eq('user', '') & Eq('group', '')
     return self.rules_soup.query(query,
                                  sort_index='valid_from',
                                  reverse=True)
Example #3
0
    def _datetime_checker(self, from_date, to_date):
        # get portal language for datetime locale formating
        # used for quering
        portal = plone.api.portal.get()
        locale = portal.language
        if len(from_date) > 0:
            try:
                from_date = convert(from_date, locale=locale)
            except DateTimeConversionError:
                return None
        if len(to_date) > 0:
            try:
                to_date = convert(to_date, locale=locale)
            except DateTimeConversionError:
                return None
            if isinstance(to_date, datetime.datetime) \
                    and to_date.hour == 0 and to_date.minute == 0:
                to_date = to_date.replace(hour=23, minute=59, second=59)

        if isinstance(from_date, str) and isinstance(to_date, str):
            return None
        if isinstance(from_date, datetime.datetime) \
                and isinstance(to_date, str):
            return Ge('created', from_date)
        if isinstance(from_date, str) \
                and isinstance(to_date, datetime.datetime):
            return Le('created', to_date)
        if isinstance(from_date, datetime.datetime) \
                and isinstance(to_date, datetime.datetime):
            return InRange('created', from_date, to_date)
Example #4
0
 def test_negate(self):
     from repoze.catalog.query import Ge
     inst = self._makeOne('index', 'val')
     self.assertEqual(inst.negate(), Ge('index', 'val'))
Example #5
0
 def csv(self, request):
     # get orders soup
     orders_soup = get_orders_soup(self.context)
     # get bookings soup
     bookings_soup = get_bookings_soup(self.context)
     # fetch user vendor uids
     vendor_uids = get_vendor_uids_for()
     # base query for time range
     query = Ge('created', self.from_date) & Le('created', self.to_date)
     # filter by given vendor uid or user vendor uids
     vendor_uid = self.vendor
     if vendor_uid:
         vendor_uid = uuid.UUID(vendor_uid)
         # raise if given vendor uid not in user vendor uids
         if vendor_uid not in vendor_uids:
             raise Unauthorized
         query = query & Any('vendor_uids', [vendor_uid])
     else:
         query = query & Any('vendor_uids', vendor_uids)
     # filter by customer if given
     customer = self.customer
     if customer:
         query = query & Eq('creator', customer)
     # prepare csv writer
     sio = StringIO()
     ex = csv.writer(sio, dialect='excel-colon', quoting=csv.QUOTE_MINIMAL)
     # exported column keys as first line
     ex.writerow(ORDER_EXPORT_ATTRS + COMPUTED_ORDER_EXPORT_ATTRS.keys() +
                 BOOKING_EXPORT_ATTRS +
                 COMPUTED_BOOKING_EXPORT_ATTRS.keys())
     # query orders
     for order in orders_soup.query(query):
         # restrict order bookings for current vendor_uids
         order_data = OrderData(self.context,
                                order=order,
                                vendor_uids=vendor_uids)
         order_attrs = list()
         # order export attrs
         for attr_name in ORDER_EXPORT_ATTRS:
             val = self.export_val(order, attr_name)
             order_attrs.append(val)
         # computed order export attrs
         for attr_name in COMPUTED_ORDER_EXPORT_ATTRS:
             cb = COMPUTED_ORDER_EXPORT_ATTRS[attr_name]
             val = cb(self.context, order_data)
             val = cleanup_for_csv(val)
             order_attrs.append(val)
         for booking in order_data.bookings:
             booking_attrs = list()
             # booking export attrs
             for attr_name in BOOKING_EXPORT_ATTRS:
                 val = self.export_val(booking, attr_name)
                 booking_attrs.append(val)
             # computed booking export attrs
             for attr_name in COMPUTED_BOOKING_EXPORT_ATTRS:
                 cb = COMPUTED_BOOKING_EXPORT_ATTRS[attr_name]
                 val = cb(self.context, booking)
                 val = cleanup_for_csv(val)
                 booking_attrs.append(val)
             ex.writerow(order_attrs + booking_attrs)
             booking.attrs['exported'] = True
             bookings_soup.reindex(booking)
     # create and return response
     s_start = self.from_date.strftime('%G-%m-%d_%H-%M-%S')
     s_end = self.to_date.strftime('%G-%m-%d_%H-%M-%S')
     filename = 'orders-export-%s-%s.csv' % (s_start, s_end)
     self.request.response.setHeader('Content-Type', 'text/csv')
     self.request.response.setHeader('Content-Disposition',
                                     'attachment; filename=%s' % filename)
     ret = sio.getvalue()
     sio.close()
     return ret
Example #6
0
    def select(cls,
               attempt=0,
               sort_index=None,
               reverse=False,
               limit=None,
               *args,
               **kwargs):
        catalog = cls._get_catalog()
        qo = None

        for key in kwargs:
            key_parts = key.split('__', 1)
            original_key = key

            key = key_parts[0]
            if key not in catalog.keys():
                print catalog.keys()
                raise NoIndex(
                    'The field %s is not in the list of indexed fields for %s'
                    % (key, cls.__name__))
            value = kwargs[original_key]

            if isinstance(value, ZODBModel):
                value = unicode(value)

            if len(key_parts) == 2:
                if key_parts[1] == 'gt':
                    nqo = Gt(key, value)
                elif key_parts[1] == 'lt':
                    nqo = Lt(key, value)
                elif key_parts[1] == 'gte':
                    nqo = Ge(key, value)
                elif key_parts[1] == 'lte':
                    nqo = Le(key, value)
                elif key_parts[1] == 'contains':
                    nqo = Contains(key, value)
                elif key_parts[1] == 'ncontains':
                    nqo = DoesNotContain(key, value)
                elif key_parts[1] == 'ne':
                    nqo = NotEq(key, value)
                elif key_parts[1] == 'in':
                    nqo = Any(key, value)
                elif key_parts[1] == 'nin':
                    nqo = NotAny(key, value)
                else:
                    raise Exception("Unknown comparator %s" % (key_parts[1]))
            else:
                nqo = Eq(key, value)

            if qo:
                qo = qo & nqo
            else:
                qo = nqo

        root = cls._get_root()
        if qo:
            _, results = catalog.query(qo,
                                       sort_index=sort_index,
                                       reverse=reverse,
                                       limit=limit)
        else:
            _, results = catalog.sort_result(root.keys(),
                                             sort_index=sort_index,
                                             reverse=reverse,
                                             limit=limit)

        try:
            return [root[x] for x in results]
        except KeyError, e:
            if attempt < 2:
                cls.index()
                return cls.select(attempt=attempt + 1, *args, **kwargs)
            raise e