Beispiel #1
0
 def set_user(self, email=None, password=None):
     context = get_context()
     shop = get_shop(context.resource)
     # Calculate the user id
     user_id = self.get_next_user_id()
     # Add the user
     cls = shop.user_class
     user = cls.make_resource(cls, self, user_id)
     # Set the email and paswword
     if email is not None:
         user.set_property('email', email)
     if password is not None:
         user.set_password(password)
     # Set default group
     root = context.root
     query = [
         PhraseQuery('format', 'user-group'),
         PhraseQuery('name', 'default')
     ]
     search = root.search(AndQuery(*query))
     documents = search.get_documents()
     group = documents[0]
     group = root.get_resource(group.abspath)
     user.set_property('user_group', str(group.get_abspath()))
     user_is_enabled = group.get_property('user_is_enabled_when_register')
     user.set_property('is_enabled', user_is_enabled)
     # Return the user
     return user
Beispiel #2
0
    def create_new_image(self, context, image):
        images = self.get_resource('images')
        query = [
            PhraseQuery('parent_path', str(images.get_canonical_path())),
            PhraseQuery('is_image', True)
        ]
        root = context.root
        results = root.search(AndQuery(*query))
        if len(results) == 0:
            name = '0'
        else:
            doc = results.get_documents(sort_by='name', reverse=True)[0]
            name = str(int(doc.name) + 1)

        # XXX Temp fix
        while images.get_resource(name, soft=True) is not None:
            name = int(name) + 1
            name = str(name)
        # End of temp fix

        filename, mimetype, body = image
        _name, type, language = FileName.decode(filename)
        cls = Image
        kw = {
            'format': mimetype,
            'filename': filename,
            'extension': type,
            'state': 'public'
        }
        return self.make_resource(cls, images, name, body, **kw)
Beispiel #3
0
 def get_items(self, resource, context, *args):
     # Base query (search in folder)
     users = resource.get_site_root().get_resource('users')
     abspath = str(users.get_canonical_path())
     query = [PhraseQuery('parent_path', abspath),
              PhraseQuery('format', 'user')]
     return SearchTableFolder_View.get_items(self, resource, context, query=query)
Beispiel #4
0
 def get_namespace(self, resource, context):
     root = context.root
     # Categories
     filters = []
     order = resource.get_resource('order')
     for name in order.get_ordered_names():
         criterium = resource.get_resource(name)
         items = criterium.get_items(context)
         # Count base query
         filters.append({'title': criterium.get_title(), 'items': items})
     # Base Count query
     query = {
         'base':
         AndQuery(*[
             PhraseQuery('format', 'product'),
             PhraseQuery('workflow_state', 'public')
         ])
     }
     for f in filters:
         for item in f['items']:
             if item['selected'] and item['query']:
                 query[item['criterium']] = item['query']
     # Count each item
     for f in filters:
         for item in f['items']:
             s = [y for x, y in query.items() if x != item['criterium']]
             if item['query']:
                 s.append(item['query'])
             item['nb_products'] = len(root.search(AndQuery(*s)))
     # Return namespace
     return {'title': resource.get_title(), 'filters': filters}
Beispiel #5
0
 def get_payments_records(self,
                          context,
                          ref=None,
                          user=None,
                          payment_way=None,
                          state=None,
                          queries=None):
     records = []
     queries = queries or []
     if ref:
         queries.append(PhraseQuery('ref', ref))
     if user:
         queries.append(PhraseQuery('user', user))
     if (state is True) or (state is False):
         queries.append(PhraseQuery('state', state))
     for payment_way in self.search_resources(cls=PaymentWay,
                                              format=payment_way):
         payments = payment_way.get_resource('payments')
         if queries:
             for record in payments.handler.search(AndQuery(*queries)):
                 ts = payments.handler.get_record_value(record, 'ts')
                 records.append((payment_way, record, ts))
         else:
             for record in payments.handler.get_records():
                 ts = payments.handler.get_record_value(record, 'ts')
                 records.append((payment_way, record, ts))
     # Sort by ts
     records.sort(key=itemgetter(2))
     records.reverse()
     records = [(x, y) for x, y, z in records]
     return records
Beispiel #6
0
 def get_namespace(self, resource, context):
     ref = context.query['ref']
     if ref is None:
         return {'ref': MSG(u'-'), 'amount': None, 'top_view': None}
     # Get informations about payment
     payment_handler = resource.get_resource('payments').handler
     query = [
         PhraseQuery('ref', ref),
         PhraseQuery('user', context.user.name)
     ]
     results = payment_handler.search(AndQuery(*query))
     if not results:
         raise ValueError, u'Payment invalid'
     record = results[0]
     amount = payment_handler.get_record_value(record, 'amount')
     # Get top view
     resource_validator = payment_handler.get_record_value(
         record, 'resource_validator')
     resource_validator = context.root.get_resource(resource_validator)
     top_view = None
     if resource_validator.end_view_top:
         top_view = resource_validator.end_view_top.GET(resource, context)
     return {
         'ref': context.query['ref'],
         'amount': format_price(amount),
         'top_view': top_view
     }
Beispiel #7
0
 def nb_orders(self):
     # XXX Orders states
     root = self.get_root()
     queries = [
         PhraseQuery('format', 'order'),
         PhraseQuery('customer_id', self.name)
     ]
     return len(root.search(AndQuery(*queries)))
Beispiel #8
0
 def get_new_resource_name(self, form):
     context = get_context()
     root = context.root
     abspath = context.resource.get_canonical_path()
     query = AndQuery(PhraseQuery('parent_path', str(abspath)),
                      PhraseQuery('format', 'shop_module_a_report'))
     search = root.search(query)
     id_report = len(search.get_documents()) + 1
     return str('report_%s' % id_report)
Beispiel #9
0
 def _get_current_reviews_query(self, context, form):
     if form['abspath']:
         product = context.root.get_resource(form['abspath'])
         abspath = product.get_canonical_path().resolve2('reviews')
     else:
         abspath = context.resource.get_canonical_path()
     query = AndQuery(PhraseQuery('parent_path', str(abspath)),
                      PhraseQuery('format', 'shop_module_a_review'))
     return query
Beispiel #10
0
 def has_pro_price(self):
     # XXX Improve in future
     root = self.get_root()
     query = [
         PhraseQuery('format', 'user-group'),
         PhraseQuery('name', 'pro')
     ]
     search = root.search(AndQuery(*query))
     return len(search) > 0
Beispiel #11
0
 def get_group(self, context):
     root = context.root
     query = [
         PhraseQuery('format', 'user-group'),
         PhraseQuery('name', 'default')
     ]
     search = root.search(AndQuery(*query))
     documents = search.get_documents()
     group = documents[0]
     return root.get_resource(group.abspath)
Beispiel #12
0
 def get_items(self, resource, context, *args):
     abspath = str(resource.get_canonical_path())
     query = [
         PhraseQuery('parent_path', abspath),
         PhraseQuery('format', 'order')
     ]
     return SearchTableFolder_View.get_items(self,
                                             resource,
                                             context,
                                             query=query)
Beispiel #13
0
 def get_base_query(self, resource, context):
     query = NeutralWS_RSS.get_base_query(self, resource, context)
     # Add products
     site_root = resource.get_site_root()
     shop = site_root.get_resource('shop')
     # XXX Search only on website
     product_query = [
         PhraseQuery('format', shop.product_class.class_id),
         PhraseQuery('workflow_state', 'public')
     ]
     return [OrQuery(AndQuery(*query), AndQuery(*product_query))]
Beispiel #14
0
 def get_items(self, resource, context, query=[]):
     option_name = context.query['option_name']
     option_value = context.query['option_value']
     query = OrQuery(
         PhraseQuery('DFT-%s' % option_name, option_value),
         PhraseQuery('DFT-DECL-%s' % option_name, option_value),
     )
     results = context.root.search(query)
     sort_by = context.query['sort_by']
     reverse = context.query['reverse']
     return results.get_documents(sort_by=sort_by, reverse=reverse)
Beispiel #15
0
    def get_items(self, resource, context, *args):
        root = context.root
        items = []
        id_query = PhraseQuery('customer_id', resource.name)
        cls_query = PhraseQuery('format', 'order')
        args = AndQuery(id_query, cls_query)
        orders = root.search(args)
        for brain in orders.get_documents():
            resource = root.get_resource(brain.abspath)
            items.append(resource)

        return items
Beispiel #16
0
 def get_nb_use(self, context, item_resource):
     nb = 0
     root = context.root
     # Enumerate use on model properties
     query = PhraseQuery('declinations_enumerates', item_resource.name)
     search = root.search(query)
     nb += len(search.get_documents())
     # Enumerate use on model schema
     query = PhraseQuery('format', 'product-model-schema')
     search = root.search(query)
     for brain in search.get_documents():
         table = root.get_resource(brain.abspath).handler
         s = table.search(datatype=item_resource.name)
         nb += len(s)
     return nb
Beispiel #17
0
 def get_items(self, context):
     options = []
     root = get_context().root
     base_abspath = self.get_property('base_abspath')
     base_resource = root.get_resource(base_abspath)
     search = root.search(format='category', parent_paths=base_abspath)
     items_list = [base_resource]
     for brain in search.get_documents(sort_by='abspath'):
         items_list.append(root.get_resource(brain.abspath))
     for resource in items_list:
         abspath = str(resource.get_abspath())
         selected = context.resource.get_abspath() == abspath
         uri = get_reference(context.get_link(resource))
         uri.query = context.uri.query
         title = resource.get_title()
         if abspath == base_abspath:
             title = MSG(u'All')
         options.append({
             'name': abspath,
             'criterium': 'category',
             'query': PhraseQuery('parent_paths', abspath),
             'selected': selected,
             'uri': uri,
             'css': 'selected' if selected else None,
             'title': title
         })
     return options
Beispiel #18
0
def get_module(resource, class_id):
    site_root = resource.get_site_root()
    # XXX use parent_paths
    query = [
        PhraseQuery('is_shop_module', True),
        PhraseQuery('format', class_id)
    ]

    # Search
    root = site_root.parent
    results = root.search(AndQuery(*query))
    if len(results) == 0:
        return None
    # XXX if more than one module ???
    doc = results.get_documents(sort_by='name')[0]
    return root.get_resource(doc.abspath)
Beispiel #19
0
 def get_nb_products(self, only_public=False):
     root = self.get_root()
     shop = get_shop(self)
     abspath = self.get_canonical_path()
     query = [
         PhraseQuery('parent_paths', str(abspath)),
         PhraseQuery('format', shop.product_class.class_id)
     ]
     if shop.get_property('hide_not_buyable_products') is True:
         context = get_context()
         group_name = get_group_name(shop, context)
         query.append(
             NotQuery(PhraseQuery('not_buyable_by_groups', group_name)))
     if only_public is True:
         query.append(PhraseQuery('workflow_state', 'public'))
     return len(root.search(AndQuery(*query)))
Beispiel #20
0
 def get_quantity(self, resource, context, item):
     get_value = resource.handler.get_record_value
     name = get_value(item, 'name')
     # On products
     quantity = 0
     register_key = 'DFT-%s' % resource.name
     if register_key not in get_register_fields():
         register_field(register_key, String(is_indexed=True))
     query = PhraseQuery(register_key, name)
     quantity += len(context.root.search(query))
     # On declination
     register_key = 'DFT-DECL-%s' % resource.name
     if register_key not in get_register_fields():
         register_field(register_key, String(is_indexed=True))
     query = PhraseQuery(register_key, name)
     quantity += len(context.root.search(query))
     return quantity
Beispiel #21
0
 def get_namespace(self, resource, context):
     root = context.root
     products = []
     abspath = str(resource.get_abspath())
     query = AndQuery(PhraseQuery('format', 'product'),
                      PhraseQuery('manufacturer', abspath),
                      PhraseQuery('workflow_state', 'public'))
     results = root.search(query)
     for result in results.get_documents():
         product = root.get_resource(result.abspath)
         products.append(product.viewbox.GET(product, context))
     return {
         'title': resource.get_title(),
         'data': resource.get_property('data'),
         'photo': resource.get_property('photo'),
         'products': products
     }
Beispiel #22
0
 def action(self, resource, context, form):
     for key in self.schema.keys():
         resource.set_property(key, form[key])
     # Check there's only one default declination
     if form['is_default'] is True:
         product = resource.parent
         query = AndQuery(PhraseQuery('format', 'product-declination'),
                          PhraseQuery('is_default', True),
                          get_base_path_query(str(product.get_abspath())))
         search = context.root.search(query)
         if len(search) >= 1:
             message = ERROR(u"There's already a default declination")
             context.message = message
             context.commit = False
             return
     # Ok
     context.message = messages.MSG_CHANGES_SAVED
Beispiel #23
0
 def render_for_product(self, resource, context):
     reviews = resource.get_resource('reviews', soft=True)
     if reviews is None:
         return {
             'nb_reviews': 0,
             'last_review': None,
             'note': None,
             'link': context.get_link(self),
             'here_abspath': str(context.resource.get_abspath()),
             'product_abspath': resource.get_abspath(),
             'viewboxes': {}
         }
     # XXX Should be in catalog for performances
     abspath = reviews.get_canonical_path()
     queries = [
         PhraseQuery('parent_path', str(abspath)),
         PhraseQuery('workflow_state', 'public'),
         PhraseQuery('format', 'shop_module_a_review')
     ]
     search = context.root.search(AndQuery(*queries))
     brains = list(search.get_documents(sort_by='mtime', reverse=True))
     nb_reviews = len(brains)
     if brains:
         last_review = brains[0]
         last_review = reduce_string(
             brains[0].shop_module_review_description, 200, 200)
     else:
         last_review = None
     note = 0
     for brain in brains:
         note += brain.shop_module_review_note
     # Get viewboxes
     viewboxes = []
     for brain in brains[:5]:
         review = context.root.get_resource(brain.abspath)
         viewbox = Review_Viewbox().GET(review, context)
         viewboxes.append(viewbox)
     return {
         'nb_reviews': nb_reviews,
         'last_review': last_review,
         'link': context.get_link(self),
         'viewboxes': viewboxes,
         'here_abspath': str(context.resource.get_abspath()),
         'product_abspath': resource.get_abspath(),
         'note': note / nb_reviews if nb_reviews else None
     }
Beispiel #24
0
 def render_for_user(self, resource, context):
     # Get review that belong to user
     query = [
         PhraseQuery('shop_module_review_author', resource.name),
         PhraseQuery('workflow_state', 'public'),
         PhraseQuery('format', 'shop_module_a_review')
     ]
     search = context.root.search(AndQuery(*query))
     brains = list(search.get_documents(sort_by='mtime', reverse=True))
     nb_reviews = len(brains)
     # Get viewboxes
     viewboxes = []
     for brain in brains[:5]:
         review = context.root.get_resource(brain.abspath)
         viewbox = Review_Viewbox().GET(review, context)
         viewboxes.append(viewbox)
     # Return namespace
     return {'nb_reviews': nb_reviews, 'viewboxes': viewboxes}
Beispiel #25
0
 def get_options(cls):
     options = [{'name': '*', 'value': MSG(u'The whole site')}]
     context = get_context()
     resource = context.resource
     root = context.root
     site_root = resource.get_site_root()
     categories = site_root.get_resource('categories')
     query = [PhraseQuery('format', 'category'),
              PhraseQuery('parent_path', str(categories.get_abspath()))]
     for brain in root.search(AndQuery(*query)).get_documents():
         categorie = root.get_resource(brain.abspath)
         nb_products = categorie.get_nb_products(only_public=True)
         if nb_products == 0:
             continue
         small_title = categorie.get_property('breadcrumb_title')
         options.append({'name': brain.abspath,
                         'value': small_title or categorie.get_title()})
     return options
Beispiel #26
0
 def test_everything(self):
     catalog = Catalog('tests/catalog', Document.fields)
     # Simple Search, hit
     results = catalog.search(data=u'lion')
     self.assertEqual(len(results), 4)
     documents = [x.name for x in results.get_documents(sort_by='name')]
     self.assertEqual(documents, ['03.txt', '08.txt', '10.txt', '23.txt'])
     # Simple Search, miss
     self.assertEqual(len(catalog.search(data=u'tiger')), 0)
     # Unindex, Search, Abort, Search
     catalog.unindex_document('03.txt')
     results = catalog.search(data=u'lion')
     self.assertEqual(len(catalog.search(data=u'lion')), 3)
     catalog.abort_changes()
     self.assertEqual(len(catalog.search(data=u'lion')), 4)
     # Query on indexed boolean
     self.assertEqual(len(catalog.search(about_wolf=True)), 5)
     # Query on stored boolean
     results = catalog.search(about_wolf=True)
     longer_stories = 0
     for result in results.get_documents():
         if result.is_long:
             longer_stories += 1
     self.assertEqual(longer_stories, 0)
     # Phrase Query
     results = catalog.search(data=u'this is a double death')
     self.assertEqual(len(results), 1)
     # Range Query
     query = RangeQuery('name', '03.txt', '06.txt')
     results = catalog.search(query)
     self.assertEqual(len(results), 4)
     # Not Query (1/2)
     query = NotQuery(PhraseQuery('data', 'lion'))
     results = catalog.search(query)
     self.assertEqual(len(results), 27)
     # Not Query (2/2)
     query1 = PhraseQuery('data', 'mouse')
     query2 = NotQuery(PhraseQuery('data', 'lion'))
     query = AndQuery(query1, query2)
     results = catalog.search(query)
     self.assertEqual(len(results), 2)
Beispiel #27
0
def get_search_query(search_schema, context, query):
    base_query = []
    if query is not None:
        base_query.extend(query)
    form = context.query
    for key, datatype in search_schema.items():
        if form[key] and issubclass(datatype, RangeDatatype):
            minimum, maximum = form[key]
            if minimum or maximum:
                base_query.append(RangeQuery(key, minimum, maximum))
        elif form[key] and key == 'abspath':
            base_query.append(StartQuery(key, form[key]))
        elif form[key] and datatype.multiple is True:
            base_query.append(
                OrQuery(*[PhraseQuery(key, x) for x in form[key]]))
        elif form[key]:
            base_query.append(PhraseQuery(key, form[key]))
    if len(base_query) > 1:
        return AndQuery(*base_query)
    elif len(base_query) == 1:
        return base_query[0]
    return None
Beispiel #28
0
 def get_sub_categories_namespace(self, resource, context):
     namespace = []
     search_word = context.query['product_search_text']
     query = AndQuery(PhraseQuery('format', 'category'),
                      PhraseQuery('title', search_word))
     for brain in context.root.search(query).get_documents():
         cat = context.root.get_resource(brain.abspath)
         nb_products = cat.get_nb_products()
         if nb_products == 0:
             continue
         img = cat.get_property('image_category')
         path_cat = resource.get_pathto(cat)
         namespace.append(
             {'name': cat.name,
              'link': context.get_link(cat),
              'title': cat.get_title(),
              'breadcrumb_title': cat.get_property('breadcrumb_title'),
              'css': None,
              'nb_products': nb_products,
              'img': str(path_cat.resolve2(img)) if img else None})
     if namespace:
         namespace[0]['css'] = 'start'
         namespace[-1]['css'] = 'end'
     return namespace
Beispiel #29
0
 def get_items(self, resource, context, *args):
     path = str(resource.parent.get_canonical_path())
     query = [
         PhraseQuery('parent_path', path),
         NotQuery(PhraseQuery('name', '404')),
         OrQuery(PhraseQuery('format', 'shop-section'),
                 PhraseQuery('format', 'products-feed'),
                 PhraseQuery('format', 'webpage'),
                 PhraseQuery('format', 'news-folder'))
     ]
     return context.root.search(AndQuery(*query))
Beispiel #30
0
    def _get_form(self, resource, context):
        form = NewInstance._get_form(self, resource, context)

        # Check if the user has already fill a review
        query = self._get_current_reviews_query(context, form)
        author_query = PhraseQuery('shop_module_review_author',
                                   context.user.name)
        query = AndQuery(query, author_query)
        if len(context.root.search(query)):
            raise FormError, ERROR(u'You already have filled a review.')

    #    form = NewInstance._get_form(self, resource, context)
    # Check images
        image = form['images']  # XXX not yet multiple
        if image:
            filename, mimetype, body = image
            if mimetype.startswith('image/') is False:
                raise FormError, MSG_UNEXPECTED_MIMETYPE(mimetype=mimetype)

        return form