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_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))
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='./')
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)
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)
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)
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))
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
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' ])
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',
def get_metadata_schema(cls): return merge_dicts(DynamicFolder.get_metadata_schema(), WorkflowAware.get_metadata_schema(), product_schema, data=XHTMLBody(multilingual=True))
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):
def get_metadata_schema(cls): return merge_dicts(Folder.get_metadata_schema(), data=XHTMLBody(multilingual=True), photo=PathDataType)