Beispiel #1
0
 def data_users(self, ctx, data):
     """Fetch and return a list of registered users known to the system.
     """
     storeSession = util.getStoreSession(ctx)
     d = self.application.getManager()
     d.addCallback(lambda manager: manager.findMany(util.getStoreSession(ctx)))
     return d
Beispiel #2
0
    def registered_users_csv(self, ctx):

        def gotUsers(users):
            
            fileData = StringIO()
            writer = csv.writer(fileData, dialect="excel")
            for user in users:
                writer.writerow([user.first_name, user.surname, user.optin, user.comments, user.email])

            return static.Data(fileData.getvalue(), 'text/comma-separated-values')

        storeSession = util.getStoreSession(ctx)
        d = self.application.getManager()
        d.addCallback(lambda manager: manager.findMany(util.getStoreSession(ctx)))
        d.addCallback(gotUsers)
        return d
        def data_facets(ctx, data):

            storeSession = util.getStoreSession(ctx)
            avatar = util.getAvatar(ctx)

            @defer.deferredGenerator
            def loadCategories(facets):
                d = defer.waitForDeferred(avatar.getCategoryManager(storeSession))
                yield d
                categories = d.getResult()
                rv = []
                for f in facets:
                    facetData = FacetData()
                    facetData.label = f[2]
                    facetData.textid = f[1]
                    rv.append(facetData)
                    d = defer.waitForDeferred(categories.loadCategories(facetData.textid))
                    yield d
                    facetData.tree = d.getResult().children
                yield rv

            d = avatar.getCategoryManager(storeSession)
            d.addCallback(lambda categories: categories.loadFacets())
            d.addCallback(loadCategories)
            return d
    def get(self, ctx):
        # Get bits we need from the context
        avatar = ctx.locate(icrux.IAvatar)
        sess = util.getStoreSession(ctx)

        # Is this for a single item?
        if self.original.id:
            return avatar.realm.cmsService.getContentManager(avatar).publicFindById(sess, self.original.id)

        # Determine the item type we are retrieving
        itemType = self.original.type
        if itemType is not None:
            itemType = sess.store.registry.typeWithName(itemType)
        where = []
        params = {}
        # Add categories to where, if any
        categories = [c for c in self.original.categories if c]
        if categories is not None:
            for i, category in enumerate(categories):
                marker = 'cat%s'%i
                where.append('categories <@ %%(%s)s'%marker)
                params[marker] = category
        if self.original.name:
            where.append('name=%(name)s')
            params['name'] = self.original.name
        if where:
            where = ' and '.join(where)
        else:
            where = None
        return avatar.realm.cmsService.getContentManager(avatar).publicFindManyContentItems(sess, itemType=itemType, where=where, params=params)
Beispiel #5
0
    def _submit_editPage(self, ctx, form, data):
        """Handle editPage form submission.
        """

        storeSession = tub_util.getStoreSession(ctx)
        def nodeUpdated(r):
            if self.original.path == self.rootPath:
                u = url.URL.fromContext(ctx)
            else:
                u = url.URL.fromContext(ctx).sibling(self.original.name)
            return u.replace('message', 'Site Map node updated successfully')

        def catchUnauthorizedException(failure):
            failure.trap(UnauthorizedException)
            u = url.URL.fromContext(ctx)
            storeSession.forceRollback = True
            return u.replace('errormessage', 'You do not have permission to update the site map.')

        app, id = self._unmapItem(data['page'])
        if self.original.path != self.rootPath:
            d = self.manager.updateNode(self.original, app, id, name=data['nodeName'], label=data['navigationLabel'], level=data['navigationLevel'])
        else:
            d = self.manager.updateNode(self.original, app, id, label=data['navigationLabel'])
        d.addCallback(nodeUpdated)
        d.addErrback(catchUnauthorizedException)
        return d
Beispiel #6
0
    def _submit(self, ctx, form, data):
        sess = util.getStoreSession(ctx)

        def updated(customer):
            return url.URL.fromContext(ctx).replace('message', 'Customer updated successfully')

        def updateFailed(failure):
            failure.trap(NotFound)
            util.getStoreSession(ctx).forceRollback = True
            return url.URL.fromContext(ctx).replace('errormessage', 'Customer update failed. Someone else has already changed the customer.')

        def update(ignore):
            for attr in ('email', 'last_name', 'first_name', 'phoneNumber', 
                'billingAddress1', 'billingAddress2', 'billingAddress3', 
                'billingCity', 'billingPostcode', 'billingCountry', 'optIn',
                'gender', 'dateOfBirth', 'secretQuestion', 'secretAnswer'):
                value = data[attr]
                setattr(self.original, attr, value)

            if data['password']:
                self.original.password = data['password']

            d = self.application.getManager()
            d.addCallback(lambda manager: manager.update(self.original, sess) )
            return d

        data = getDataFromForm(form, data)

        d = defer.Deferred()
        d.addCallback(lambda ignore: update(data))
        d.addCallback(lambda ignore: sess.flush())
        d.addCallback(updated)
        d.addErrback(updateFailed)
        d.callback(None)
        return d
Beispiel #7
0
    def _submit(self, ctx, form, data):
        sess = tub_util.getStoreSession(ctx)

        def updated(artwork):
            return url.URL.fromContext(ctx).replace('message', 'Artwork updated successfully')

        def updateFailed(failure):
            failure.trap(NotFound)
            tub_util.getStoreSession(ctx).rollbackAlways = True
            return url.URL.fromContext(ctx).replace('errormessage', 'Artwork update failed. Someone else has already changed the artwork.')

        def update(ignore):
            d = self.application.getManager()
            d.addCallback(lambda manager: manager.update(self.original, data, sess) )
            return d

        data = getDataFromForm(form, data)

        d = defer.Deferred()
        d.addCallback(lambda ignore: update(data))
        d.addCallback(lambda ignore: sess.flush())
        d.addCallback(updated)
        d.addErrback(updateFailed)
        d.callback(None)
        return d
Beispiel #8
0
    def form_delivery_charge(self, ctx):

        def convert(data):
            if data is None:
                data = []
            return '\r\n'.join( [ ';'.join([str(i) for i in r]) for r in data ] )

        def buildForm(item):

            form = formal.Form()
            form.addField('countries', formal.String(required=True), widgetFactory=formal.TextArea)
            form.addField('rates', formal.String(required=True), widgetFactory=formal.TextArea)
            form.addAction(self._update, label='Update')

            form.data = {
                'countries': convert(item.countries),
                'rates': convert(item.rates)}

            return form

        storeSession = util.getStoreSession(ctx)
        d = self.application.getManager()
        d.addCallback(lambda manager: manager.find(storeSession))
        d.addCallback(buildForm)
        return d
Beispiel #9
0
    def _locateComponentChild(self, ctx, segments):

        avatar = itub.IAvatar(ctx, None)
        if avatar is None:
            return appserver.NotFound

        try:
            app, component = avatar.applications.componentByName(segments[0])
        except KeyError:
            return appserver.NotFound

        # Build a list of skins provided by the application and/or component.
        skins = [getattr(app, 'skin', None), getattr(component, 'skin', None)]
        skins = [s for s in skins if s]

        try:
            storeSession = util.getStoreSession(ctx)
            return util.appendSkinsAndCall(ctx, skins,
                    component.resourceFactory, avatar, storeSession,
                    segments[1:])
        except TypeError:
            import warnings
            warnings.warn(
                "IApplicationComponent.resourceFactory now takes a storeSession, please update %s."%component.name,
                DeprecationWarning)
            return util.appendSkinsAndCall(ctx, skins,
                    component.resourceFactory, avatar, segments[1:])
Beispiel #10
0
    def _submit(self, ctx, form, data):

        storeSession = util.getStoreSession(ctx)


        def _updateStock(product, storeSession, manager, adjustment):
            d = updateStock(storeSession, manager.getStockManager(), product.id, adjustment)
            d.addCallback(lambda ignore: product)
            return d


        def addProduct(manager):
            d = manager.create(storeSession, data)
            d.addCallback(_updateStock, storeSession, manager, stockData.get('stock.adjustment'))
            return d


        def created(product):
            return url.URL.fromContext(ctx).sibling(product.id).replace('message', 'Product added successfully')


        stockData = extractGroup('stock.', data)
        data = getDataFromForm(form, data)

        d = self.application.getManager()
        d.addCallback(addProduct)
        d.addCallback(created)
        return d
Beispiel #11
0
    def data_voucher_definitions(self, ctx, data):
  
        storeSession = util.getStoreSession(ctx)
        def voucherDefinitionFactory():
            return self.app.getManager().getVoucherDefinitions(storeSession)

        return VoucherDefinitionsModel(voucherDefinitionFactory)
Beispiel #12
0
    def _submit(self, ctx, form, data):
        sess = util.getStoreSession(ctx)

        def userUpdated(user):
            return url.URL.fromContext(ctx).replace('message', 'User updated successfully')

        def updateFailed(failure):
            failure.trap(NotFound)
            util.getStoreSession(ctx).rollbackAlways = True
            return url.URL.fromContext(ctx).replace('errormessage', 'User update failed. Someone else has already changed the user.')

        def update(data):
            self.original.first_name = data['first_name']
            self.original.surname = data['surname']
            self.original.email = data['email']
            self.original.comments = data['comments']
            self.original.optin = data['optin']
            self.original.touch()


        # Don't allow the user name to be changed
        d = defer.Deferred()
        d.addCallback(lambda ignore: update(data))
        d.addCallback(lambda ignore: sess.flush())
        d.addCallback(userUpdated)
        d.addErrback(updateFailed)
        d.callback(None)
        return d
Beispiel #13
0
 def data_facets(self,ctx,data):
     # Get a list of category facets
     def getFacetNames(facets):
         facets = [ {'label':f[2],'textid':f[1]} for f in facets ]
         return facets
     storeSession = util.getStoreSession(ctx)
     d = self.avatar.getCategoryManager(storeSession)
     d.addCallback(lambda categories: categories.loadFacets())
     d.addCallback(getFacetNames)
     return d
Beispiel #14
0
    def _submit(self, ctx, form, data):

        sess = util.getStoreSession(ctx)

        def userCreated(user):
            return url.URL.fromContext(ctx).sibling(user.id).replace('message', 'User added successfully')

        d = self.application.getManager()
        d.addCallback(lambda manager: manager.registerUser(sess,data['first_name'],data['surname'],data['optin'],data['comments'],data['email']))
        d.addCallback(userCreated)
        return d
    def data_searchresults(self, ctx, data):

        args = inevow.IRequest(ctx).args

        query = args.get('categories', [''])

        avatar = icrux.IAvatar(ctx)
        storeSession = util.getStoreSession(ctx)
        d = self.imageFactory.getImages(avatar, storeSession, query)
        d.addCallback(self._setUpPaging, ctx)
        return d
Beispiel #16
0
    def _update(self, ctx, form, data):

        def updated():
            return url.URL.fromContext(ctx).sibling(self.voucherDefinition.voucher_definition_id).replace('message', 'Voucher updated successfully')

        self.voucherType.getEditor().update(self.voucherDefinition, data)
        
        storeSession = util.getStoreSession(ctx)
        d = self.app.getManager().update(storeSession, self.voucherDefinition)
        d.addCallback(lambda ignore: updated())
        return d
 def render_fragmentTemplate(self,ctx,data):
     sess = util.getStoreSession(ctx)
     items = yield sess.getItems(fragmenttype.FragmentType)
     for item in items:
         if item.name == self.original.protectedObject.type:
             fragmentType = item
             break
     template = fragmentType.template
     from genshi.template import NewTextTemplate as TextTemplate
     tmpl = TextTemplate(fragmentType.template)
     output = tmpl.generate(**self.original.protectedObject.data)
     returnValue(T.xml(output.render('text')))
Beispiel #18
0
    def _create(self, ctx, form, data):
        creator = self.voucherType.getCreator()

        voucherDefinition = creator.create(ctx, form, data)

        def created(voucher):
            return url.URL.fromContext(ctx).sibling(voucher.voucher_definition_id).replace('message', 'Voucher added successfully')

        storeSession = util.getStoreSession(ctx)
        d = self.app.getManager().add(storeSession, voucherDefinition)
        d.addCallback(created)
        return d
Beispiel #19
0
 def _moveNode(self, ctx, nodeId, direction):
     storeSession = tub_util.getStoreSession(ctx)
     def nodeMoved(r):
         return url.URL.fromContext(ctx).replace('message', 'Child site map node moved successfully')
     def catchUnauthorizedException(failure):
         failure.trap(UnauthorizedException)
         u = url.URL.fromContext(ctx)
         storeSession.forceRollback = True
         return u.replace('errormessage', 'You do not have permission to update the site map.')
     d = self.manager.moveNode(self.original.findChildById(nodeId), direction)
     d.addCallback(nodeMoved)
     d.addErrback(catchUnauthorizedException)
     return d
Beispiel #20
0
    def _submit(self, ctx, form, data):

        sess = tub_util.getStoreSession(ctx)

        def created(artwork):
            return url.URL.fromContext(ctx).sibling(artwork.id).replace('message', 'Artwork added successfully')

        data = getDataFromForm(form, data)

        d = self.application.getManager()
        d.addCallback(lambda manager: manager.create(sess, data))
        d.addCallback(created)
        return d
Beispiel #21
0
    def child_products_csv(self, ctx):
        DECIMAL_ZERO = Decimal('0.00')

        def encodeValue(value):
            value = unicode(value or '').encode('utf8')
            return value

        def getAttrDict(product):
            rv = {}
            for attr in product._attrs:
                value = getattr(product,attr, None)

                if isinstance(value, RichTextData):
                    # Get the content out of Rich Text types
                    value = encodeValue(value.content)
                elif isinstance(value, (types.ListType, types.TupleType)):
                    # encode the items in the list
                    value = [encodeValue(v) for v in value if v]
                    if value == []:
                        value = encodeValue('')
                elif value and attr in ( 'mainImage'):
                    # create a url for images
                    value = '/system/ecommerce/%s/%s'%(product.id,attr)
                    value = encodeValue(value)
                elif isinstance(value, Decimal):
                    # Put pence into prices
                    value = value.quantize(DECIMAL_ZERO)
                    value = encodeValue(value)
                else:
                    value = encodeValue(value)

                rv[attr] = value

            return rv

        def gotProducts(products):
            fileData = StringIO()
            writer = None
            for product in products:
                if writer is None:
                    writer = csv.DictWriter(fileData, product._attrs, dialect="excel")
                    writer.writerow( dict([(a,a) for a in product._attrs]) )
                writer.writerow(getAttrDict(product))

            return static.Data(fileData.getvalue(), 'text/comma-separated-values')

        storeSession = util.getStoreSession(ctx)
        d = self.application.getManager()
        d.addCallback(lambda manager: manager.findMany(storeSession))
        d.addCallback(gotProducts)
        return d
Beispiel #22
0
    def data_salesorders(self, ctx, data):
        """
        Build a sales model for the view.
        """
        # Get the status, default to confirmed
        status = ctx.arg('status') or manager.SalesOrder.CONFIRMED
        storeSession = util.getStoreSession(ctx)

        def salesOrdersFactory():
            def _(**kw):
                return self.app.getManager().getSalesOrders(storeSession, **kw)
            return _

        return SalesOrdersModel(salesOrdersFactory(), status=status)
Beispiel #23
0
    def childFactory(self, ctx, userId):
        # User IDs are always ints
        try:
            userId = int(userId)
        except ValueError:
            return None

        def error(failure):
            failure.trap(objstore.NotFound)
            return None

        sess = util.getStoreSession(ctx)
        d = self.application.getManager()
        d.addCallback(lambda manager: manager.findById(sess, userId))
        return d.addCallback(EditUserPage).addErrback(error)
Beispiel #24
0
    def childFactory(self, ctx, id):
        # IDs are always ints
        try:
            id = int(id)
        except ValueError:
            return None

        def error(failure):
            failure.trap(NotFound)
            return None

        sess = util.getStoreSession(ctx)
        d = self.application.getManager()
        d.addCallback(lambda manager: manager.findById(sess, id))
        return d.addCallback(EditProductPage, self.application).addErrback(error)
Beispiel #25
0
    def _moveCategory(self, ctx, textid, direction):
        def moved(r):
            return url.URL.fromContext(ctx).replace('message', 'Category moved successfully')

        def catchUnauthorizedException(failure):
            failure.trap(capabilities.UnauthorizedException)
            u = url.URL.fromContext(ctx)
            sess.forceRollback = True
            return u.replace('errormessage', 'You do not have permission to update categories.')

        storeSession = util.getStoreSession(ctx)
        d = self.avatar.getCategoryManager(storeSession)
        d.addCallback(lambda categories: categories.moveNode(self.node.findChildById(textid), direction))
        d.addCallback(moved)
        d.addErrback(catchUnauthorizedException)
        return d
Beispiel #26
0
 def _submit_addCategory(self, ctx, form, data):
     def added(r):
         return url.URL.fromContext(ctx).replace('message', 'Category added successfully')
     def addError( failure ):
         failure.trap(error.NotUniqueError)
         raise xforms.FieldValidationError( 'duplicate textid', 'textid' )
     def catchUnauthorizedException(failure):
         failure.trap(capabilities.UnauthorizedException)
         u = url.URL.fromContext(ctx)
         sess.forceRollback = True
         return u.replace('errormessage', 'You do not have permission to update categories.')
     storeSession = util.getStoreSession(ctx)
     d = self.avatar.getCategoryManager(storeSession)
     d.addCallback(lambda categories: categories.addChildToNode(self.node, data['textid'], data['label']))
     d.addCallbacks(added,addError)
     d.addErrback(catchUnauthorizedException)
     return d
Beispiel #27
0
    def childFactory(self, ctx, name):
        """
        Create a resource for the Sale instance.
        """

        # A sale is always identified by an int
        try:
            salesOrderId = int(name)
        except ValueError:
            return

        # Find the sale.
        storeSession = util.getStoreSession(ctx)
        d = self.app.getManager().getSalesOrder(storeSession, salesOrderId)
        # Create the resource to edit the sale
        d.addCallback(lambda salesOrder: SalesOrderPage(self.avatar, self.app, salesOrder))
        return d
Beispiel #28
0
    def childFactory(self, ctx, name):
        """
        Create a resource for the Voucher Definition instance.
        """

        # A sale is always identified by an int
        try:
            id = int(name)
        except ValueError:
            return

        # Find the sale.
        storeSession = util.getStoreSession(ctx)
        d = self.app.getManager().getVoucherDefinition(storeSession, id)
        # Create the resource to edit the sale
        d.addCallback(lambda voucherDefinition: EditVoucherDefinitionPage(self.avatar, 
            self.app, voucherDefinition, self.voucherType))
        return d
Beispiel #29
0
    def _submit(self, ctx, form, data):
        storeSession = util.getStoreSession(ctx)

        def updated():
            return url.URL.fromContext(ctx).replace('message', 'Product updated successfully')

        def updateFailed(failure):
            failure.trap(NotFound)
            util.getStoreSession(ctx).forceRollback = True
            return url.URL.fromContext(ctx).replace('errormessage', 'Product update failed. Someone else has already changed the product.')

        def update(manager, data):


            def _updateStock(storeSession, stockManager, adjustment):
                # Only manage stock on the product directly if it has no options
                if not self.original.hasOptions():
                    d = updateStock(storeSession, stockManager, self.original.id, adjustment)
                    d.addCallback(lambda ignore: tidyStock(storeSession, stockManager, self.original))
                else:
                    d = defer.succeed(None)
                return d


            optionsData = extractGroup('options.', data)
            stockData = extractGroup('stock.', data)
            data = getDataFromForm(form, data)

            d = defer.succeed(None)
            if manager.hasOptionManager():
                # Check for and process options first
                d.addCallback(lambda ignore: updateOptions(storeSession, manager, self.original, optionsData))

            d.addCallback(lambda ignore: _updateStock(storeSession, manager.getStockManager(), stockData.get('stock.adjustment')))
            d.addCallback(lambda ignore: manager.update(self.original, data, storeSession))
            return d


        d = self.application.getManager()
        d.addCallback(update, data)
        d.addCallback(lambda ignore: storeSession.flush())
        d.addCallback(lambda ignore: updated())
        d.addErrback(updateFailed)
        return d
Beispiel #30
0
    def _submit_editCategory(self, ctx, form, data):
        """Handle editCategory form submission.
        """

        def categoryUpdated(r):
            u = url.URL.fromContext(ctx).sibling(self.node.textid)
            return u.replace('message', 'Category updated succesfully')

        def catchUnauthorizedException(failure):
            failure.trap(capabilities.UnauthorizedException)
            u = url.URL.fromContext(ctx)
            sess.forceRollback = True
            return u.replace('errormessage', 'You do not have permission to update categories.')

        storeSession = util.getStoreSession(ctx)
        d = self.avatar.getCategoryManager(storeSession)
        d.addCallback(lambda categories: categories.updateNode(self.node, data['textid'], data['label']))
        d.addCallback(categoryUpdated)
        d.addErrback(catchUnauthorizedException)
        return d