def sources_choices(node, kw): request = node.bindings['request'] values = [] values = [(str(get_oid(s)), s.title) for s in getattr(request.root, 'site_folders', [])] values = sorted(values, key=lambda e: e[1]) values.insert(0, ('self', _('This site'))) values.insert(0, ('all', _('All sites'))) return Select2Widget(values=values, multiple=True)
def boolean_widget(node, kw): request = node.bindings['request'] localizer = request.localizer values = [('True', localizer.translate(_('Yes'))), ('False', localizer.translate(_('No')))] return RadioChoiceWidget( values=values, template='lac:views/' 'templates/radio_choice.pt', inline=True, **kwargs)
def price_str(self): subscription = getattr(self, 'subscription', None) if subscription: subscription_type = subscription.get('subscription_type') price = subscription.get('price') if price == 0: return _('Free') if subscription_type == 'subscription': return str(price)+'€/Month' return str(price)+'€/Unit' return _('Free')
def start(self, context, request, appstruct, **kw): site = get_site_folder(True) url = request.resource_url(context, "") deadline_date = context.init_deadline( datetime.datetime.now(tz=pytz.UTC)) localizer = request.localizer deadline_str = to_localized_time( deadline_date, request, format_id='defined_literal', ignore_month=True, ignore_year=True, translate=True) mail_template = site.get_mail_template('preregistration') subject = mail_template['subject'] deadline_str = to_localized_time( deadline_date, request, format_id='defined_literal', ignore_month=True, ignore_year=True, translate=True) message = mail_template['template'].format( preregistration=context, user_title=localizer.translate( _(getattr(context, 'user_title', ''))), url=url, deadline_date=deadline_str.lower(), lac_title=request.root.title) alert('email', [site.get_site_sender()], [context.email], {'subject': subject, 'body': message}) request.registry.notify(ActivityExecuted(self, [context], get_current())) return {}
def contact_invariant(self, appstruct): appstruct_copy = appstruct.copy() appstruct_copy.pop('surtax') if 'title' in appstruct_copy: appstruct_copy.pop('title') if not any(v != "" and v != colander.null for v in list(appstruct_copy.values())): raise colander.Invalid(self, _('One value must be entered.')) if 'phone' in appstruct and appstruct['phone'] and \ ('surtax' not in appstruct or \ 'surtax' in appstruct and not appstruct['surtax']): raise colander.Invalid(self, _('Surtax field must be filled in.'))
class SendResult(ElementaryAction): style = 'button' #TODO add style abstract class style_descriminator = 'global-action' style_picto = 'glyphicon glyphicon-envelope' style_order = 7 submission_title = _('Continue') context = IGame roles_validation = send_roles_validation processsecurity_validation = send_processsecurity_validation relation_validation = global_relation_validation state_validation = send_state_validation def start(self, context, request, appstruct, **kw): winners = context.get_participants_by_mail(appstruct.get( 'winners', [])) participants = context.get_participants_by_mail( appstruct.get('participants', [])) context.winners = PersistentDict(winners) context.participants = PersistentDict(participants) subject_template = appstruct.pop('subject') mail_template = appstruct.pop('message') site = get_site_folder(True) for email, winner in winners.items(): subject = subject_template.format() mail = mail_template.format(first_name=winner['first_name'], last_name=winner['last_name']) alert('email', [site.get_site_sender()], [email], { 'subject': subject, 'body': mail }) return {} def redirect(self, context, request, **kw): return HTTPFound(request.resource_url(context, "@@index"))
class ManageKeywordsFormView(FormView): title = _('Manage keywords') schema = ManageKeywordsSchema() behaviors = [ManageKeywords, Cancel] formid = 'formmanagekeywords' name = 'formmanagekeywords'
class FileSchema(VisualisableElementSchema, SearchableEntitySchema): text = colander.SchemaNode( colander.String(), widget=RichTextWidget(), title=_("Text") )
def keywords_choice(node, kw): root = getSite() values = [(k, k) for k in root.keywords_ids] values.insert(0, ('', _('- Select -'))) return Select2Widget( values=values, create=True)
class VenueSchema(OriginVenue): title = colander.SchemaNode( colander.String(), widget=TextInputWidget(), title=_('Title') )
def contacts_invariant(self, appstruct): if not appstruct['contacts'] and \ any(not s['venue']['other_conf']['contacts'] for s in appstruct['schedules']): raise colander.Invalid( self.get('contacts'), _("Event's contact or all venues's contacts must be defined."))
class Draw(ElementaryAction): style = 'button' #TODO add style abstract class style_descriminator = 'global-action' style_picto = 'glyphicon glyphicon-trash' style_order = 7 submission_title = _('Continue') actionType = ActionType.system context = IGame roles_validation = draw_roles_validation relation_validation = global_relation_validation def start(self, context, request, appstruct, **kw): context.state = PersistentList(['expired']) context.modified_at = datetime.datetime.now(tz=pytz.UTC) winner_number = context.winner_number participants = list(context.participants.keys()) winners = [] if len(participants) <= winner_number: winners = participants else: winners = random.sample(participants, winner_number) winners = context.get_participants_by_mail(winners) context.winners = PersistentDict(winners) context.reindex() return {} def redirect(self, context, request, **kw): root = getSite() return HTTPFound(request.resource_url(root, ""))
class RemoveSmartFolderViewMultipleView(MultipleView): title = _('Remove the smart folder') name = 'removesmartfolder' viewid = 'removesmartfolder' template = 'daceui:templates/simple_mergedmultipleview.pt' views = (RemoveSmartFolderViewStudyReport, RemoveSmartFolderView) validators = [RemoveSmartFolder.get_validator()]
def venue_choice(node, kw): context = node.bindings['context'] request = node.bindings['request'] venues = node.bindings.get('venues', []) venues = [(context, context.title)] venues.insert(0, ('', _('- Select -'))) ajax_url = request.resource_url(context, '@@cinemaapi', query={'op': 'find_cinema_venue'}) def title_getter(obj): if not isinstance(obj, str): return getattr(obj, 'title', obj) else: try: obj = get_obj(int(obj), None) if obj: return obj.title else: return obj except Exception as e: log.warning(e) return obj return AjaxSelect2Widget(values=venues, ajax_url=ajax_url, title_getter=title_getter, ajax_item_template="venue_item_template", css_class="venue-title")
class ConfigureSiteFolder(InfiniteCardinality): style = 'button' #TODO add style abstract class style_descriminator = 'text-action' style_picto = 'glyphicon glyphicon-wrench' style_order = 2 submission_title = _('Save') context = ISiteFolder roles_validation = siteadmin_roles_validation def start(self, context, request, appstruct, **kw): site_folder = appstruct['_object_data'] site_folder.modified_at = datetime.datetime.now(tz=pytz.UTC) site_folder.filters = PersistentList( getattr(site_folder, 'filters', [])) filters = getattr(site_folder, 'filters', []) root = getSite() for filter_ in filters: sources = filter_.get('other_filter', {}).get('sources', []) if sources and 'self' in sources: sources_ = list(sources) sources_.remove('self') sources_.append(str(get_oid(site_folder))) filter_['other_filter']['sources'] = list(set(sources_)) tree = filter_.get('metadata_filter', {}).get('tree', None) if tree: site_folder.merge_tree(tree) root.merge_tree(tree) site_folder.reindex() return {} def redirect(self, context, request, **kw): return HTTPFound(request.resource_url(context, "@@index"))
class FixAccessPerimeter(InfiniteCardinality): style = 'button' style_descriminator = 'footer-entity-action' style_picto = 'glyphicon glyphicon-eye-open' style_order = 0 submission_title = _('Save') context = IEntity roles_validation = siteadmin_roles_validation def start(self, context, request, appstruct, **kw): access_control = appstruct['access_control'] if 'self' in access_control: site = get_site_folder(True, request) if site: access_control = list(access_control) access_control.remove('self') access_control.append(get_oid(site)) access_control = [get_oid(obj, obj) for obj in access_control] context.access_control = PersistentList(access_control) context.reindex() return {} def redirect(self, context, request, **kw): return HTTPFound(request.resource_url(context, "@@index"))
def update(self): source_oid = self.params('source') targets_oid = self.params('targets') if targets_oid and source_oid: try: if not isinstance(targets_oid, (list, tuple)): targets_oid = [targets_oid] targets = [get_obj(int(t)) for t in targets_oid] source = get_obj(int(source_oid)) if targets and source: result = self.execute( {'source': source, 'targets': targets}) if result and result[0].get('error', False): view_error = ViewError() view_error.principalmessage = _("An error has occurred.") return self.failure(view_error) return HTTPFound( self.request.resource_url(source, '@@index')) except Exception as error: log.warning(error) return HTTPFound(self.request.resource_url(self.context, ''))
class AddSiteFolder(InfiniteCardinality): style_descriminator = 'admin-action' style_picto = 'glyphicon glyphicon-globe' style_order = 0 submission_title = _('Save') context = ICreationCulturelleApplication roles_validation = admin_roles_validation def start(self, context, request, appstruct, **kw): new_site_folder = appstruct['_object_data'] templates = appstruct.get('mail_templates', []) for template in templates: template['title'] = DEFAULT_SITE_MAILS[ template['mail_id']]['title'] new_site_folder.mail_templates = templates context.addtoproperty('site_folders', new_site_folder) new_site_folder.state.append('published') new_site_folder.setproperty('author', get_current()) new_site_folder.filters = PersistentList( getattr(new_site_folder, 'filters', [])) new_site_folder.urls_ids = PersistentList( getattr(new_site_folder, 'urls_ids', [])) new_site_folder.reindex() return {'newcontext': new_site_folder} def redirect(self, context, request, **kw): return HTTPFound( request.resource_url(kw['newcontext'], "@@configuresitefolder"))
class SeeFilesView(BasicView): title = _('Files') name = 'seefiles' behaviors = [SeeFiles] template = 'lac:views/lac_view_manager/templates/search_result.pt' viewid = 'seefiles' def update(self): self.execute(None) objects = self.context.files default = datetime.datetime.now(tz=pytz.UTC) objects = sorted(objects, key=lambda e: getattr(e, 'modified_at', default), reverse=True) batch = Batch(objects, self.request, default_size=BATCH_DEFAULT_SIZE) batch.target = "#results_files" len_result = batch.seqlen result_body = [] for obj in batch: object_values = {'object': obj} body = self.content(args=object_values, template=obj.templates['default'])['body'] result_body.append(body) result = {} values = {'bodies': result_body, 'length': len_result, 'batch': batch} body = self.content(args=values, template=self.template)['body'] item = self.adapt_item(body, self.viewid) result['coordinates'] = {self.coordinates: [item]} return result
class PublishAdvertising(InfiniteCardinality): style = 'button' #TODO add style abstract class style_descriminator = 'global-action' style_interaction = 'modal-action' style_picto = 'glyphicon glyphicon-ok' style_order = 5 submission_title = _('Continue') context = IAdvertising roles_validation = publish_roles_validation state_validation = publish_state_validation processsecurity_validation = publish_processsecurity_validation def start(self, context, request, appstruct, **kw): context.state = PersistentList(['published']) context.modified_at = datetime.datetime.now(tz=pytz.UTC) context.reindex() if getattr(context, '_tree', None): tree = getattr(context, '_tree') request.get_site_folder.merge_tree(tree) getSite().merge_tree(tree) return {} def redirect(self, context, request, **kw): return HTTPFound(request.resource_url(context, "@@index"))
class PayCulturalEvent(InfiniteCardinality): style = 'button' #TODO add style abstract class style_descriminator = 'text-action' style_picto = 'glyphicon glyphicon-credit-card' style_order = 3 submission_title = _('Continue') context = ICulturalEvent roles_validation = pay_roles_validation state_validation = pay_state_validation processsecurity_validation = pay_processsecurity_validation def start(self, context, request, appstruct, **kw): if appstruct.get('paid', True): context.state = PersistentList(['submitted']) submit_artists(context.artists) submit_venues([s.venue for s in context.schedules if s.venue]) submit_cultural_event(context) context.modified_at = datetime.datetime.now(tz=pytz.UTC) context.reindex() request.registry.notify( ActivityExecuted(self, [context], get_current())) return {} def redirect(self, context, request, **kw): return HTTPFound(request.resource_url(context, "@@index"))
class RemoveReviewViewMultipleView(MultipleView): title = _('Remove') name = 'removereview' viewid = 'removereview' template = 'daceui:templates/simple_mergedmultipleview.pt' views = (RemoveReviewViewStudyReport, RemoveReviewView) validators = [RemoveReview.get_validator()]
class PeriodicAdvertising(Advertising): """PeriodicAdvertising class""" type_title = _('Periodical advertisement') icon = 'lac-icon icon-periodic-advertising' templates = { 'default': 'lac:views/templates/periodic_advertisting_result.pt', 'bloc': 'lac:views/templates/periodic_advertisting_result.pt' } name = renamer() def get_content_data(self, request=None): if request is None: request = get_current_request() result = {'url': '', 'type': 'none'} if self.picture: result = { 'url': self.picture.url, 'filename': self.picture.filename } if self.picture.mimetype.startswith('application/pdf'): result['type'] = 'pdf' else: #application/quarkxpress, application/x-quark-express result['type'] = 'xpress' return result
def update(self): self.execute(None) objects = find_entities( user=get_current(), interfaces=[IOrganization], sort_on='modified_at', reverse=True) batch = Batch(objects, self.request, default_size=BATCH_DEFAULT_SIZE) batch.target = "#results_organizations" len_result = batch.seqlen index = str(len_result) if len_result > 1: index = '*' self.title = _(CONTENTS_MESSAGES[index], mapping={'nember': len_result}) result_body = [] for obj in batch: object_values = {'object': obj} body = self.content(args=object_values, template=obj.templates['default'])['body'] result_body.append(body) result = {} values = { 'bodies': result_body, 'length': len_result, 'batch': batch, } body = self.content(args=values, template=self.template)['body'] item = self.adapt_item(body, self.viewid) result['coordinates'] = {self.coordinates: [item]} return result
class PublishFilmSynopsesViewMultipleView(MultipleView): title = _('Publish the film synopsis') name = 'publishfilmsynopses' viewid = 'publishfilmsynopses' template = 'daceui:templates/simple_mergedmultipleview.pt' views = (PublishFilmSynopsesViewStudyReport, PublishFilmSynopsesView) validators = [PublishFilmSynopses.get_validator()]
def update(self): self.execute(None) root = getSite() objects = root.preregistrations objects.reverse() batch = Batch(objects, self.request, default_size=BATCH_DEFAULT_SIZE) batch.target = "#results_registrations" len_result = batch.seqlen index = str(len_result) if len_result > 1: index = '*' self.title = _(CONTENTS_MESSAGES[index], mapping={'nember': len_result}) result_body = [] for obj in batch: object_values = {'object': obj} body = self.content(args=object_values, template=obj.templates['default'])['body'] result_body.append(body) result = {} values = { 'bodies': result_body, 'length': len_result, 'batch': batch, } body = self.content(args=values, template=self.template)['body'] item = self.adapt_item(body, self.viewid) result['coordinates'] = {self.coordinates: [item]} return result
class RenewModerationServiceViewMultipleView(MultipleView): title = _('Renew the moderation service') name = 'renewmoderationservice' viewid = 'renewmoderationservice' template = 'daceui:templates/simple_mergedmultipleview.pt' views = (RenewModerationServiceViewStudyReport, RenewModerationServiceView) validators = [RenewModerationService.get_validator()]
class EditInterviewView(FormView): title = _('Edit the interview') schema = select(InterviewSchema(factory=Interview, editable=True, omit=('artists_ids', 'artists', 'metadata')), ['title', 'review', 'tree', 'artists_ids', 'artists', 'picture', 'article', 'signature', 'informations', 'showcase_review', ('metadata', ['accessibility', 'object_labels', 'connections_to'])]) behaviors = [EditInterview, Cancel] formid = 'formmoderationeditinterview' name = 'moderationeditinterview' requirements = {'css_links': [], 'js_links': ['lac:static/js/artist_management.js']} def default_data(self): result = self.context.get_data(self.schema) result['artists'] = get_artist_data( result['artists'], self.schema.get('artists').children[0]) picture = get_file_data(result['picture']) result.update(picture) result[OBJECT_OID] = get_oid(self.context) return result
def start(self, context, request, appstruct, **kw): login = appstruct['email'] adapter = request.registry.queryMultiAdapter( (context, request), IUserLocator ) if adapter is None: adapter = DefaultUserLocator(context, request) user = adapter.get_user_by_email(login) if user is not None: principals = find_service(user, 'principals') reset = principals.add_reset(user) reseturl = request.resource_url(reset) email = user.email site = get_site_folder(True) localizer = request.localizer mail_template = site.get_mail_template('reset_password') subject = mail_template['subject'] message = mail_template['template'].format( person=user, user_title=localizer.translate( _(getattr(user, 'user_title', ''))), reseturl=reseturl, lac_title=request.root.title) alert('email', [site.get_site_sender()], [email], {'subject': subject, 'body': message}) return {}
class ManageKeywordsView(MultipleView): title = _('Manage keywords') name = 'managekeywords' viewid = 'managekeywords' template = 'daceui:templates/mergedmultipleview.pt' views = (ManageKeywordsViewStudyReport, ManageKeywordsFormView) validators = [ManageKeywords.get_validator()]
class RejectGameViewMultipleView(MultipleView): title = _('Reject the advertisement') name = 'rejectgame' viewid = 'rejectgame' template = 'daceui:templates/simple_mergedmultipleview.pt' views = (RejectGameViewStudyReport, RejectGameView) validators = [RejectGame.get_validator()]
class FindEntitiesJson(FormView): """Find entities form.""" title = _('Find entities') name = 'find' schema = FindFilterSchema() behaviors = [Send] def calculate_posted_filter(self): form, reqts = self._build_form() form.formid = self.viewid + '_' + form.formid posted_formid = None if '__formid__' in self.request.POST: posted_formid = self.request.POST['__formid__'] if posted_formid is not None and posted_formid == form.formid: controls = self.request.POST.items() validated = form.validate(controls) return validated return None def before_update(self): root = getSite() self.action = self.request.resource_url(root, '@@webservices_finder', query={'op': 'find_entities'})
class RemoveFilmsynopsesViewMultipleView(MultipleView): title = _('Remove the film synopsis') name = 'removefilmsynopses' viewid = 'removefilmsynopses' template = 'daceui:templates/simple_mergedmultipleview.pt' views = (RemoveFilmsynopsesViewStudyReport, RemoveFilmsynopsesView) validators = [RemoveFilmSynopses.get_validator()]
class CreatOrganizationsView(FormView): title = _('Creat organizations') schema = CreatOrganizationsSchema() behaviors = [CreatOrganizations, Cancel] formid = 'formcreatorganizations' name = 'creatorganizations'
class PayCulturalEventViewMultipleView(MultipleView): title = _('Pay the cultural event') name = 'payculturalevent' viewid = 'payculturalevent' template = 'daceui:templates/mergedmultipleview.pt' views = (PayCulturalEventViewStudyReport, PayCulturalEventView) validators = [PayCulturalEvent.get_validator()]
class LabelSchema(VisualisableElementSchema): picture = colander.SchemaNode( ObjectDataOrigin(Image), widget=get_file_widget(file_type=['image']), title=_('Picture'), )
class PayCulturalEventView(FormView): title = _('Submit') name = 'payculturaleventform' formid = 'formpayculturalevent' schema = omit(PaySchema(), ['_csrf_token_']) behaviors = [PayCulturalEvent] validate_behaviors = False action = 'https://paiement.systempay.fr/vads-payment/' def update(self): payment_confirmation = self.params('payment_confirmation') if payment_confirmation: #@TODO traitement du paiment pass else: return super(PayCulturalEventView, self).update() def before_update(self): formwidget = deform.widget.FormWidget(css_class='compareform') formwidget.template = 'lac:views/templates/pay_form.pt' cancel_url = self.request.resource_url(self.context, '@@index') formwidget.cancel_url = cancel_url self.schema.widget = formwidget def default_data(self): #@TODO calcul de la signature et des valeur du formulaire return {'signature': 'testsignature'}
class RemoveBriefViewMultipleView(MultipleView): title = _('Remove the news flash') name = 'removebrief' viewid = 'removebrief' template = 'daceui:templates/simple_mergedmultipleview.pt' views = (RemoveBriefViewStudyReport, RemoveBriefView) validators = [RemoveBrief.get_validator()]
def update(self): self.execute(None) user = get_current() site = str(get_oid(get_site_folder(True))) games = find_entities(interfaces=[IGame], metadata_filter={'states': ['published']}, other_filter={'sources': [site]}, force_publication_date=True) batch = Batch(games, self.request, default_size=BATCH_DEFAULT_SIZE) batch.target = "#results_contents" len_result = batch.seqlen index = str(len_result) if len_result > 1: index = '*' self.title = _(CONTENTS_MESSAGES[index], mapping={'nember': len_result}) result_body = [] for obj in batch: render_dict = {'object': obj, 'current_user': user, 'state': None} body = self.content(args=render_dict, template=obj.templates['default'])['body'] result_body.append(body) result = {} values = {'bodies': result_body, 'batch': batch} body = self.content(args=values, template=self.template)['body'] item = self.adapt_item(body, self.viewid) result['coordinates'] = {self.coordinates: [item]} return result
class ArchiveVenueViewMultipleView(MultipleView): title = _('Archive the venue') name = 'archivevenue' viewid = 'archivevenue' template = 'daceui:templates/simple_mergedmultipleview.pt' views = (ArchiveVenueViewStudyReport, ArchiveVenueView) validators = [ArchiveVenue.get_validator()]
def _init_definition(self): self.defineNodes( start = StartEventDefinition(), pg = ParallelGatewayDefinition(), #First loop pgblock1 = ParallelGatewayDefinition(), pgblock1sync = ParallelGatewayDefinition(), egblock1 = ExclusiveGatewayDefinition(), archiveculturalevent = ActivityDefinition(contexts=[ArchiveCulturalEvent], description=_("Archive cultural events"), title=_("Archive cultural events"), groups=[]), send_newsletters = ActivityDefinition(contexts=[SendNewsletters], description=_("Send newsletters"), title=_("Send newsletters"), groups=[]), alert_users = ActivityDefinition(contexts=[AlertUsers], description=_("Alert users"), title=_("Alert users"), groups=[]), timerblock1 = IntermediateCatchEventDefinition( TimerEventDefinition( time_date=calculate_next_date_block1)), #Second loop pgblock2 = ParallelGatewayDefinition(), pgblock2sync = ParallelGatewayDefinition(), egblock2 = ExclusiveGatewayDefinition(), synchronizepublishsettings = ActivityDefinition(contexts=[SynchronizePublishSettings], description=_("Synchronize publish settings"), title=_("Synchronize publish settings"), groups=[]), timerblock2 = IntermediateCatchEventDefinition( TimerEventDefinition( time_date=calculate_next_date_block2)), end = EndEventDefinition(), ) self.defineTransitions( TransitionDefinition('start', 'pg'), #First loop TransitionDefinition('pg', 'egblock1'), TransitionDefinition('egblock1', 'pgblock1'), TransitionDefinition('pgblock1', 'archiveculturalevent'), TransitionDefinition('archiveculturalevent', 'pgblock1sync'), TransitionDefinition('pgblock1', 'send_newsletters'), TransitionDefinition('send_newsletters', 'pgblock1sync'), TransitionDefinition('pgblock1', 'alert_users'), TransitionDefinition('alert_users', 'pgblock1sync'), TransitionDefinition('pgblock1sync', 'timerblock1'), TransitionDefinition('timerblock1', 'egblock1'), #Second loop TransitionDefinition('pg', 'egblock2'), TransitionDefinition('egblock2', 'pgblock2'), TransitionDefinition('pgblock2', 'synchronizepublishsettings'), TransitionDefinition('synchronizepublishsettings', 'pgblock2sync'), TransitionDefinition('pgblock2sync', 'timerblock2'), TransitionDefinition('timerblock2', 'egblock2'), )
def _init_definition(self): self.defineNodes( start = StartEventDefinition(), pg = ParallelGatewayDefinition(), create_service = ActivityDefinition(contexts=[CreateModerationService, CreateSellingTicketsService, CreateImportService, CreateExtractionService, CreatePromotionService, CreateNewsletterService], description=_("Add a moderation service"), title=_("Add a moderation service"), groups=[]), see_service = ActivityDefinition(contexts=[SeeModerationService, SeeSellingTicketsService, SeeImportService, SeeExtractionService, SeePromotionService, SeeNewsletterService, SeeModerationUnitService], description=_("Details"), title=_("Details"), groups=[]), renew_service = ActivityDefinition(contexts=[RenewModerationService, RenewSellingTicketsService, RenewImportService, RenewExtractionService, RenewPromotionService, RenewNewsletterService], description=_("Renew the service"), title=_("Renew"), groups=[]), edit = ActivityDefinition(contexts=[EditModerationService, EditSellingTicketsService, EditImportService, EditExtractionService, EditPromotionService, EditNewsletterService], description=_("Edit the service"), title=_("Edit"), groups=[]), remove = ActivityDefinition(contexts=[RemoveModerationService, RemoveSellingTicketsService, RemoveImportService, RemoveExtractionService, RemovePromotionService, RemoveNewsletterService], description=_("Remove the service"), title=_("Remove"), groups=[]), eg = ExclusiveGatewayDefinition(), end = EndEventDefinition(), ) self.defineTransitions( TransitionDefinition('start', 'pg'), TransitionDefinition('pg', 'create_service'), TransitionDefinition('create_service', 'eg'), TransitionDefinition('pg', 'renew_service'), TransitionDefinition('renew_service', 'eg'), TransitionDefinition('pg', 'edit'), TransitionDefinition('edit', 'eg'), TransitionDefinition('pg', 'remove'), TransitionDefinition('remove', 'eg'), TransitionDefinition('pg', 'see_service'), TransitionDefinition('see_service', 'eg'), TransitionDefinition('eg', 'end'), )
def _init_definition(self): self.defineNodes( start = StartEventDefinition(), pg = ParallelGatewayDefinition(), add_promotions = ActivityDefinition(contexts=[AddPromotions], description=_("Add promotions"), title=_("Add promotions"), groups=[]), eg = ExclusiveGatewayDefinition(), end = EndEventDefinition(), ) self.defineTransitions( TransitionDefinition('start', 'pg'), TransitionDefinition('pg', 'add_promotions'), TransitionDefinition('add_promotions', 'eg'), TransitionDefinition('eg', 'end'), )
def update(self): self.execute(None) user = get_current() filter_form, filter_data = self._add_filter(user) content_types = ['cultural_event', 'venue', 'artist'] args = {'metadata_filter': {'content_types': content_types}} args = merge_with_filter_view(self, args) args['request'] = self.request if not args.get('metadata_filter', {}).get('content_types', []): metadata_filter = args.get('metadata_filter', {}) metadata_filter['content_types'] = content_types args['metadata_filter'] = metadata_filter args['metadata_filter']['states'] = ['published'] objects = find_entities(user=user, sort_on='object_title', reverse=False, include_site=True, **args) url = self.request.resource_url(self.context, 'allduplicates') def condition(obj): """Batch condition""" return obj.get_duplicates() batch = ConditionalBatch( condition, objects, self.request, url=url, default_size=15) batch.target = "#results_contents" len_result = batch.seqlen index = str(len_result) if len_result > 1: index = '*' self.title = _(CONTENTS_MESSAGES[index], mapping={'nember': len_result}) filter_data['filter_message'] = self.title filter_body = self.filter_instance.get_body(filter_data) result_body = [] for obj in batch: render_dict = {'object': obj, 'current_user': user, 'state': get_states_mapping(user, obj, getattr(obj, 'state_or_none', [None])[0])} body = self.content(args=render_dict, template=obj.templates['duplicates'])['body'] result_body.append(body) result = {} values = {'bodies': result_body, 'batch': batch, 'filter_body': filter_body} body = self.content(args=values, template=self.template)['body'] item = self.adapt_item(body, self.viewid) result['coordinates'] = {self.coordinates: [item]} result['css_links'] = filter_form['css_links'] result['js_links'] = filter_form['js_links'] return result
def _init_definition(self): self.defineNodes( start = StartEventDefinition(), pg = ParallelGatewayDefinition(), see_service = ActivityDefinition(contexts=[SeeServiceDefinition], description=_("Details"), title=_("Details"), groups=[]), edit = ActivityDefinition(contexts=[EditServiceDefinition], description=_("Edit the service definition"), title=_("Edit"), groups=[]), sees = ActivityDefinition(contexts=[SeeServicesDefinition], description=_("See definitions"), title=_("Service definitions"), groups=[_('See')]), eg = ExclusiveGatewayDefinition(), end = EndEventDefinition(), ) self.defineTransitions( TransitionDefinition('start', 'pg'), TransitionDefinition('pg', 'edit'), TransitionDefinition('edit', 'eg'), TransitionDefinition('pg', 'see_service'), TransitionDefinition('see_service', 'eg'), TransitionDefinition('pg', 'sees'), TransitionDefinition('sees', 'eg'), TransitionDefinition('eg', 'end'), )
def _init_definition(self): self.defineNodes( start = StartEventDefinition(), pg = ParallelGatewayDefinition(), update = ActivityDefinition(contexts=[Update], description=_("Update processes"), title=_("update processes"), groups=[_('More')]), eg = ExclusiveGatewayDefinition(), end = EndEventDefinition(), ) self.defineTransitions( TransitionDefinition('start', 'pg'), TransitionDefinition('pg', 'update'), TransitionDefinition('update', 'eg'), TransitionDefinition('eg', 'end'), )
def __init__(self, context, request): site = get_site_folder(True) site_id = get_oid(site) self.context = context self.request = request self.default_folder = SmartFolder(title=_('My private folders'), style=DEFAULT_FOLDER_COLORS, ) self.default_folder.folder_order[site_id] = 1000
def update(self): self.execute(None) user = get_current() validated = getattr(self, 'validated', {}) posted = self.request.POST or self.request.GET or {} posted = posted.copy() clear_posted = False if not validated: if posted: clear_posted = True searcinstance = SearchView(self.context, self.request, filter_result=True) if searcinstance.validated: validated = searcinstance.validated objects = find_entities( user=user, sort_on='release_date', reverse=True, include_site=True, **validated) url = self.request.resource_url( self.context, self.request.view_name, query=posted) batch = Batch(objects, self.request, default_size=core.BATCH_DEFAULT_SIZE, url=url) #clear posted values: See usermenu panel if clear_posted: if self.request.POST: self.request.POST.clear() elif self.request.GET: self.request.GET.clear() batch.target = "#results_contents" len_result = batch.seqlen index = str(len_result) if len_result > 1: index = '*' self.title = _(CONTENTS_MESSAGES[index], mapping={'nember': len_result}) result_body = [] for obj in batch: render_dict = {'object': obj, 'current_user': user, 'state': get_states_mapping(user, obj, getattr(obj, 'state_or_none', [None])[0])} body = self.content(args=render_dict, template=obj.templates['default'])['body'] result_body.append(body) result = {} values = {'bodies': result_body, 'batch': batch} body = self.content(args=values, template=self.template)['body'] item = self.adapt_item(body, self.viewid) result['coordinates'] = {self.coordinates: [item]} return result
def validate(cls, context, request, **kw): from pyramid.security import authenticated_userid if has_role(role=('Admin',)) or \ authenticated_userid(request) == 'admin': if not request.user: request.user = request.root['principals']['users']['admin'] return True raise ValidationError(msg=_("Permission denied"))
def __call__(self, node, value): country = value.get('country', 'fr') number = value.get('number', '') pattern_data = PHONE_PATTERNS.get(country, None) if pattern_data: pattern = pattern_data[1] if not pattern.match(number): raise colander.Invalid( node, _(self.msg, mapping={'phone': number, 'country': pattern_data[0]}))
def __call__(self, node, value): """ Returns a ``colander.Function`` validator that uses the context (user) to validate the password.""" user = get_current() if value['changepassword'] and \ not user.check_password(value['currentuserpassword']): raise colander.Invalid(node.get('currentuserpassword'), _(' Invalid current password')) if value['changepassword']: colander.Length(min=3, max=100)(node.get('password'), value['password'])
def _init_definition(self): self.defineNodes( start = StartEventDefinition(), pg = ParallelGatewayDefinition(), edit = ActivityDefinition(contexts=[EditCulturalEvent], description=_("Edit the cultural event"), title=_("Edit"), groups=[]), reject = ActivityDefinition(contexts=[RejectCulturalEvent], description=_("Reject the cultural event"), title=_("Reject"), groups=[]), publish = ActivityDefinition(contexts=[PublishCulturalEvent], description=_("Publish the cultural event"), title=_("Publish"), groups=[]), eg = ExclusiveGatewayDefinition(), end = EndEventDefinition(), ) self.defineTransitions( TransitionDefinition('start', 'pg'), TransitionDefinition('pg', 'reject'), TransitionDefinition('reject', 'eg'), TransitionDefinition('pg', 'publish'), TransitionDefinition('publish', 'eg'), TransitionDefinition('pg', 'edit'), TransitionDefinition('edit', 'eg'), TransitionDefinition('eg', 'end'), )
def text_to_search_widget(node, kw): context = node.bindings['context'] request = node.bindings['request'] root = getSite() ajax_url = request.resource_url(context, '@@creationculturelapi', query={'op': 'find_entities'}) advanced_search_url = request.resource_url( root, '@@advanced_search') return SearchTextInputWidget( url=ajax_url, advanced_search_url=advanced_search_url, placeholder=_('Ex. théâtre le 13 juillet'))
def find_entities_by_artist(self): user = get_current() artist_id = self.params('artist') if not artist_id: objects = [] else: artist = get_obj(int(artist_id), None) if not artist: objects = [] else: objects = find_entities( user=user, metadata_filter={'states': ['published']}, contribution_filter={'artists_ids': [artist]}, sort_on='release_date', reverse=True, include_site=True) batch = Batch(objects, self.request, url=self.request.url, default_size=core.BATCH_DEFAULT_SIZE) batch.target = "#results" len_result = batch.seqlen result_body = [] for obj in batch: object_values = {'object': obj, 'current_user': user, 'state': None} body = self.content(args=object_values, template=obj.templates['default'])['body'] result_body.append(body) values = { 'bodies': result_body, 'batch': batch, } body = self.content(args=values, template=self.template)['body'] len_result = len(objects) index = str(len_result) if len_result > 1: index = '*' title = _(CONTENTS_MESSAGES[index], mapping={'nember': len_result}) values = { 'body': body, 'title': title } body = self.content(args=values, template=self.wrapper_template)['body'] return {'body': body}
def before_update(self): site = get_site_folder(True) services = site.get_all_services( kinds=['sellingtickets', 'extractionservice'], delegation=False) if 'sellingtickets' not in services: self.schema = omit(self.schema, ['selling_tickets', ('schedules', ['ticketing_url'])]) if 'extractionservice' in services: self.schema.get('description').description = _( 'Describe succinctly the event.' ' Only this part of the description will ' 'be included in the paper version of the magazine.')
def start(self, context, request, appstruct, **kw): data = context.get_data(PersonSchema()) annotations = getattr(context, 'annotations', {}).get(PROCESS_HISTORY_KEY, []) data.update({'password': appstruct['password']}) data = {key: value for key, value in data.items() if value is not colander.null} data.pop('title') structure = data.pop('structure') site = get_site_folder(True) root = getSite() person = Person(**data) principals = find_service(root, 'principals') name = getattr(person, 'first_name', '') + ' '\ + getattr(person, 'last_name', '') users = principals['users'] name = name_chooser(users, name=name) users[name] = person if structure: grant_roles(person, roles=(('CulturalAnimator', site),)) person.setproperty('structure', structure) else: grant_roles(person, roles=(('Member', site),)) grant_roles(person, roles=('Member',)) grant_roles(person, (('Owner', person),)) person.state.append('active') person.reindex() get_socket().send_pyobj( ('stop', 'persistent_' + str(get_oid(context)))) root.delfromproperty('preregistrations', context) person.add_customeraccount() person.init_annotations() person.annotations.setdefault( PROCESS_HISTORY_KEY, PersistentList()).extend(annotations) request.registry.notify(ActivityExecuted(self, [person], person)) transaction.commit() localizer = request.localizer mail_template = site.get_mail_template('subscription_statement') subject = mail_template['subject'] message = mail_template['template'].format( person=person, user_title=localizer.translate( _(getattr(person, 'user_title', ''))), login_url=request.resource_url(root, '@@login'), lac_title=request.root.title) alert('email', [site.get_site_sender()], [person.email], {'subject': subject, 'body': message}) return {'person': person}
def _init_definition(self): self.defineNodes( start = StartEventDefinition(), pg = ParallelGatewayDefinition(), creat = ActivityDefinition(contexts=[CreateFile], description=_("Create a file"), title=_("Create a file"), groups=[_('Add')]), editfile = ActivityDefinition(contexts=[EditFile], description=_("Edit the file"), title=_("Edit"), groups=[]), seefile = ActivityDefinition(contexts=[SeeFile], description=_("Details"), title=_("Details"), groups=[]), seefiles = ActivityDefinition(contexts=[SeeFiles], description=_("Files"), title=_("Files"), groups=[_('See')]), eg = ExclusiveGatewayDefinition(), end = EndEventDefinition(), ) self.defineTransitions( TransitionDefinition('start', 'pg'), TransitionDefinition('pg', 'creat'), TransitionDefinition('creat', 'eg'), TransitionDefinition('pg', 'seefile'), TransitionDefinition('seefile', 'eg'), TransitionDefinition('pg', 'editfile'), TransitionDefinition('editfile', 'eg'), TransitionDefinition('pg', 'seefiles'), TransitionDefinition('seefiles', 'eg'), TransitionDefinition('eg', 'end'), )
def validate_file_content(node, appstruct, width, height): if appstruct['picture']: mimetype = appstruct['picture']['mimetype'] file_value = getattr(appstruct['picture']['fp'], 'raw', appstruct['picture']['fp']) if mimetype.startswith('image'): try: file_value.seek(0) except Exception as e: log.warning(e) img = Image.open(file_value) img_width = img.size[0] img_height = img.size[1] file_value.seek(0) if img_width > width or img_height > height: raise colander.Invalid(node, _ (_('The image size is not valid: the allowed size is ${width} x ${height} px.', mapping={'width': width, 'height': height}))) if mimetype.startswith('application/x-shockwave-flash'): try: file_value.seek(0) except Exception as e: log.warning(e) header = parse(file_value) file_value.seek(0) flash_width = header['width'] flash_height = header['height'] if flash_width > width or flash_height > height: raise colander.Invalid(node, _ (_('The flash animation size is not valid: the allowed size is ${width} x ${height} px.', mapping={'width': width, 'height': height})))