예제 #1
0
 def get_metadata_schema(cls):
     return merge_dicts(
         ShopFolder.get_metadata_schema(),
         data=XHTMLBody(multilingual=True),
         breadcrumb_title=Unicode(multilingual=True),
         image_category=ImagePathDataType(multilingual=True),
         default_product_cover=ImagePathDataType(multilingual=True))
예제 #2
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(),
                        data=XHTMLBody(multilingual=True),
                        title=Unicode(multilingual=True),
                        enabled=Boolean(default=True),
                        only_this_groups=UserGroup_Enumerate(multiple=True),
                        logo=ImagePathDataType(multilingual=True))
예제 #3
0
class PaymentWay_Configure(DBResource_Edit):

    access = 'is_admin'

    schema = {
        'title': Unicode(mandatory=True, multilingual=True),
        'logo': ImagePathDataType(mandatory=True, multilingual=True),
        'data': XHTMLBody(mandatory=True, multilingual=True),
        'only_this_groups': UserGroup_Enumerate(multiple=True),
        'enabled': Boolean(mandatory=True)
    }

    widgets = [
        TextWidget('title', title=MSG(u'Title')),
        ImageSelectorWidget('logo', title=MSG(u'Logo')),
        BooleanRadio('enabled', title=MSG(u'Enabled ?')),
        RTEWidget('data', title=MSG(u"Description")),
        SelectWidget('only_this_groups', title=MSG(u"Only for this groups"))
    ]

    submit_value = MSG(u'Edit configuration')

    def get_value(self, resource, context, name, datatype):
        language = resource.get_content_language(context)
        return resource.get_property(name, language=language)

    def action(self, resource, context, form):
        language = resource.get_content_language(context)
        for key, datatype in self.schema.items():
            if getattr(datatype, 'multilingual', False):
                resource.set_property(key, form[key], language=language)
            else:
                resource.set_property(key, form[key])
        return context.come_back(messages.MSG_CHANGES_SAVED, goto='./')
예제 #4
0
class Manufacturer(Folder):

    class_id = 'manufacturer'
    class_title = MSG(u'Manufacturer')
    class_views = ['view', 'edit']

    view = Manufacturer_View()
    edit = AutomaticEditView()
    add_image = CurrentFolder_AddImage()

    # Edit configuration
    edit_show_meta = True
    edit_schema = {
        'data': XHTMLBody(mandatory=True, multilingual=True),
        'photo': PathDataType(mandatory=True)
    }

    edit_widgets = [
        ImageSelectorWidget('photo', title=MSG(u'Photo')),
        RTEWidget('data', title=MSG(u'Data'))
    ]

    @classmethod
    def get_metadata_schema(cls):
        return merge_dicts(Folder.get_metadata_schema(),
                           data=XHTMLBody(multilingual=True),
                           photo=PathDataType)
예제 #5
0
class ShopForm(OrderedTable):

    class_id = 'shop-form'
    class_title = MSG(u'Shop form')
    class_version = '20090609'
    class_handler = ShopFormTable
    class_views = ['display', 'edit', 'view', 'add_record']

    display = ShopForm_Display()
    view = OrderedTable_View(search_template=None, access='is_admin')
    edit = AutomaticEditView()

    add_product = AddProduct_View()

    form = [
        TextWidget('name', title=MSG(u'Name')),
        TextWidget('title', title=MSG(u'Title')),
        BooleanCheckBox('mandatory', title=MSG(u'Mandatory')),
        BooleanCheckBox('multiple', title=MSG(u'Multiple')),
        SelectWidget('datatype', title=MSG(u'Data Type')),
        SelectWidget('widget', title=MSG(u'Widget')),
    ]

    edit_widgets = [
        TextWidget('submit_value', title=MSG(u'Submit value')),
        TextWidget('to_addr', title=MSG(u'To addr')),
        RTEWidget('introduction', title=MSG(u'Introduction')),
        RTEWidget('final_message', title=MSG(u'Final message')),
        BooleanRadio('must_be_authentificated',
                     title=MSG(u'Must be authentificated to see form'))
    ]

    edit_schema = {
        'submit_value': Unicode(multilingual=True, mandatory=True),
        'to_addr': Email(mandatory=True),
        'introduction': XHTMLBody(multilingual=True),
        'final_message': XHTMLBody(multilingual=True),
        'must_be_authentificated': Boolean
    }

    @classmethod
    def get_metadata_schema(cls):
        return merge_dicts(OrderedTable.get_metadata_schema(), cls.edit_schema)
예제 #6
0
class ShopModule_Advertising_Ad(ShopFolder):

    class_id = 'shop_module_advertising_ad'
    class_title = MSG(u'Advertising, an Ad')
    class_views = ['edit']

    edit = AutomaticEditView()

    edit_schema = {'code': XHTMLBody(sanitize_html=False)}
    edit_widgets = [MultilineWidget('code', title=MSG(u'Code'))]

    @classmethod
    def get_metadata_schema(cls):
        return merge_dicts(ShopFolder.get_metadata_schema(), cls.edit_schema)
예제 #7
0
 def get_schema(self, resource, context):
     product_model = resource.get_product_model()
     site_root = resource.get_site_root()
     shop = get_shop(site_root)
     # Cover is mandatory
     mandatory = shop.get_property('product_cover_is_mandatory')
     product_schema['cover'].mandatory = mandatory
     # Return schema
     return merge_dicts(
               product_schema,
               (product_model.get_model_schema() if product_model else {}),
               data=XHTMLBody(multilingual=True),
               category=CategoriesEnumerate,
               not_buyable_by_groups=UserGroup_Enumerate(multiple=True),
               tags=TagsList(site_root=site_root, multiple=True))
예제 #8
0
class ShopUser_Group(ShopFolder):

    class_id = 'user-group'
    class_views = ['edit', 'goto_categories', 'register', 'schema', 'welcome']
    class_version = '20100719'
    class_title = MSG(u'User group')

    edit = AutomaticEditView()
    schema = GoToSpecificDocument(specific_document='schema',
                                  title=MSG(u'Schema'))
    welcome = GoToSpecificDocument(specific_document='welcome',
                                  title=MSG(u'Edit welcome page'))
    goto_categories = GoToSpecificDocument(
            specific_document='../../../categories',
            title=MSG(u'Revenir aux catégories'))
    register = Group_Register()

    edit_schema = {'register_title': Unicode(multilingual=True),
                   'register_body': XHTMLBody(multilingual=True),
                   'register_mail_subject': Unicode(multilingual=True),
                   'register_mail_body': Unicode(multilingual=True),
                   'validation_mail_subject': Unicode(multilingual=True),
                   'validation_mail_body': Unicode(multilingual=True),
                   'invalidation_mail_subject': Unicode(multilingual=True),
                   'invalidation_mail_body': Unicode(multilingual=True),
                   'hide_address_on_registration': Boolean,
                   'user_is_enabled_when_register': Boolean,
                   'use_default_price': Boolean,
                   'show_ht_price': Boolean,
                   'phone_is_mandatory_on_registration': Boolean,
                   'lastname_is_mandatory_on_registration': Boolean}

    edit_widgets = [TextWidget('register_title', title=MSG(u'Register view title ?')),
                    RTEWidget('register_body', title=MSG(u'Register body')),
                    TextWidget('register_mail_subject', title=MSG(u'Register mail subject')),
                    MultilineWidget('register_mail_body', title=MSG(u'Register mail body')),
                    TextWidget('validation_mail_subject', title=MSG(u'Validation mail subject')),
                    MultilineWidget('validation_mail_body', title=MSG(u'Validation mail body')),
                    TextWidget('invalidation_mail_subject', title=MSG(u'Invalidation mail subject')),
                    MultilineWidget('invalidation_mail_body', title=MSG(u'Invalidation mail body')),
                    BooleanRadio('hide_address_on_registration', title=MSG(u'Hide address on registration')),
                    BooleanRadio('user_is_enabled_when_register', title=MSG(u'User is enabled ?')),
                    BooleanRadio('use_default_price', title=MSG(u'Use default price ?')),
                    BooleanRadio('show_ht_price', title=MSG(u'Show HT price ?')),
                    BooleanRadio('lastname_is_mandatory_on_registration', title=MSG(u'Lastname is mandatory on registration ?')),
                    BooleanRadio('phone_is_mandatory_on_registration', title=MSG(u'Phone is mandatory on registration ?'))]



    __fixed_handlers__ = ShopFolder.__fixed_handlers__ + ['welcome']


    @staticmethod
    def _make_resource(cls, folder, name, *args, **kw):
        # Create group
        ShopFolder._make_resource(cls, folder, name, *args, **kw)
        # Group schema
        cls = CustomerSchema
        cls._make_resource(cls, folder, '%s/schema' % name)
        # Welcome Page
        cls = WebPage
        cls._make_resource(cls, folder, '%s/welcome' % name,
                                title={'en': u'Welcome'},
                                state='public')

    @classmethod
    def get_metadata_schema(cls):
        return merge_dicts(ShopFolder.get_metadata_schema(),
                           cls.edit_schema)


    def get_dynamic_schema(self):
        schema = self.get_resource('schema')
        return schema.get_model_schema()


    def get_dynamic_widgets(self):
        schema = self.get_resource('schema')
        return schema.get_model_widgets()


    def get_register_mail_subject(self):
        subject = self.get_property('register_mail_subject')
        if subject:
            return subject
        return MSG(u"Inscription confirmation.").gettext()


    def get_register_mail_body(self):
        body = self.get_property('register_mail_body')
        if body:
            return body
        return MSG(u"Your inscription has been validated").gettext()


    def get_prefix(self):
        # Price prefix
        # XXX for future we should add group property to price
        if self.name == 'default':
            return ''
        return '%s-' % self.name
예제 #9
0
class Category(ShopFolder):

    class_id = 'category'
    class_title = MSG(u'Category')

    # Edit configuration
    edit_show_meta = True
    edit_schema = {
        'data': XHTMLBody(multilingual=True),
        'breadcrumb_title': Unicode(multilingual=True),
        'image_category': ImagePathDataType(multilingual=True),
        'default_product_cover': ImagePathDataType(multilingual=True)
    }

    edit_widgets = [
        TextWidget('breadcrumb_title', title=MSG(u'Breadcrumb title')),
        ImageSelectorWidget('image_category', title=MSG(u'Category image')),
        ImageSelectorWidget('default_product_cover',
                            title=MSG(u'Default cover for products')),
        RTEWidget('data', title=MSG(u"Description"))
    ]

    # Views
    view = Category_View()
    browse_content = Products_View()
    view_categories = Category_BackofficeView()
    edit = AutomaticEditView()
    batch_edition = Category_BatchEdition()
    new_product = Product_NewProduct()
    new_category = NewCategory_Form()
    comparator = Category_Comparator()

    @property
    def class_views(self):
        context = get_context()
        # Back-Office
        hostname = context.uri.authority
        if hostname[:6] == 'admin.':
            return [
                'browse_content', 'new_product', 'view_categories',
                'new_category', 'edit'
            ]
        return ['view', 'edit']

    @classmethod
    def get_metadata_schema(cls):
        return merge_dicts(
            ShopFolder.get_metadata_schema(),
            data=XHTMLBody(multilingual=True),
            breadcrumb_title=Unicode(multilingual=True),
            image_category=ImagePathDataType(multilingual=True),
            default_product_cover=ImagePathDataType(multilingual=True))

    def _get_catalog_values(self):
        # Get the languages
        site_root = self.get_site_root()
        languages = site_root.get_property('website_languages')
        # Titles
        m_title = {}
        m_breadcrumb_title = {}
        for language in languages:
            value = self.get_property('title', language=language)
            if value:
                m_title[language] = value
            value = self.get_property('breadcrumb_title', language=language)
            if value:
                m_breadcrumb_title[language] = value
        # Data
        data = self.get_property('data')
        if data is not None:
            data = xml_to_text(data)
        return merge_dicts(
            super(Category, self)._get_catalog_values(),
            data=data,
            # XXX Hack to be on sitemap
            workflow_state='public',
            m_title=m_title,
            m_breadcrumb_title=m_breadcrumb_title)

    def get_document_types(self):
        return [Product, Category]

    ####################################
    # Computed fields
    ####################################
    computed_schema = {
        'nb_products': Integer(title=MSG(u'Nb products')),
        'nb_categories': Integer(title=MSG(u'Nb sub categories'))
    }

    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)))

    def get_nb_categories(self):
        root = self.get_root()
        abspath = self.get_canonical_path()
        query = AndQuery(PhraseQuery('parent_paths', str(abspath)),
                         PhraseQuery('format', 'category'))
        return len(root.search(query))

    @property
    def nb_products(self):
        return self.get_nb_products()

    @property
    def nb_categories(self):
        return self.get_nb_categories()

    #############################
    # Export
    #############################
    export = Export(export_resource=Product,
                    access='is_allowed_to_edit',
                    file_columns=[
                        'reference', 'state', 'frontoffice_uri', 'cover_uri',
                        'manufacturer', 'price_with_tax', 'description'
                    ])
예제 #10
0
from ikaaro.forms import AutoForm, ImageSelectorWidget, MultilineWidget
from ikaaro.forms import RTEWidget, TextWidget, XHTMLBody
from ikaaro.folder_views import Folder_BrowseContent
from ikaaro.resource_views import EditLanguageMenu

# Import from shop
from shop.utils import bool_to_img

# XXX msg_if_no_shipping must be multilingual

shippings_schema = {
    'default_shipping_way_title': Unicode(mandatory=True, multilingual=True),
    'default_shipping_way_logo': String(mandatory=True),
    'default_shipping_way_description': Unicode(mandatory=True,
                                                multilingual=True),
    'msg_if_no_shipping': XHTMLBody(mandatory=True, multilingual=True)
}


class Shippings_Configure(AutoForm):

    access = 'is_admin'
    title = MSG(u'Configure')
    context_menus = [EditLanguageMenu()]

    schema = shippings_schema

    widgets = [
        TextWidget('default_shipping_way_title',
                   title=MSG(u'Default shipping way title')),
        ImageSelectorWidget('default_shipping_way_logo',
예제 #11
0
 def get_metadata_schema(cls):
     return merge_dicts(DynamicFolder.get_metadata_schema(),
                        WorkflowAware.get_metadata_schema(),
                        product_schema,
                        data=XHTMLBody(multilingual=True))
예제 #12
0
파일: models.py 프로젝트: nicolasderam/shop
real_datatypes = {
    'string': String,
    'unicode': Unicode,
    'big-unicode': BigUnicode,
    'integer': Integer,
    'decimal': Decimal,
    'cm_to_inch': DatatypeCM_to_INCH,
    'boolean': ShopBoolean,
    'three-state-boolean': ThreeStateBoolean,
    'path': PathDataType(action='add_link_file'),
    'image': ImagePathDataType,
    'product': ProductPathDataType,
    'email': Email,
    'html': XHTMLBody,
    'html-non-sanitize': XHTMLBody(sanitize_html=False),
    'unicode-one-per-line': UnicodeOnePerLine,
    'french-date': FrenchDate,
    'birthday': FrenchBirthday_Datatype,
    'pretty-french-date': PrettyFrenchDate,
    'siret': SIRET_Datatype,
    'date': ISOCalendarDate
}


def get_default_widget_shop(datatype):
    if issubclass(datatype, BigUnicode):
        return MultilineWidget
    elif issubclass(datatype, FrenchBirthday_Datatype):
        return BirthdayWidget
    elif issubclass(datatype, ThreeStateBoolean):
예제 #13
0
 def get_metadata_schema(cls):
     return merge_dicts(Folder.get_metadata_schema(),
                        data=XHTMLBody(multilingual=True),
                        photo=PathDataType)