def bootstrap_voteit(echo=True): """ Bootstrap site root. Will add: - Site root - Agenda template folder - Users folder - An administrative user with login: admin and pass: admin """ if echo: print "Bootstrapping site - creating 'admin' user with password 'admin'" #Add root root = createContent('SiteRoot', title=_(u"VoteIT"), creators=['admin']) root.set_field_value( 'footer', u'<a href="http://www.voteit.se">www.voteit.se</a> — ' u'<a href="http://manual.voteit.se">User and developer manual</a> — ' u'<a href="https://github.com/VoteIT">Source code and bugtracker</a>') #Add users folder root['agenda_templates'] = createContent('AgendaTemplates', title=_(u"Agenda templates"), creators=['admin']) #Add users folder root['users'] = createContent('Users', title=_(u"Registered users"), creators=['admin']) users = root.users #Add user admin - note that creators also set owner, which is important for changing password admin = createContent('User', password='******', creators=['admin'], first_name=_(u'VoteIT'), last_name=_(u'Administrator')) users['admin'] = admin #Add admin to group managers root.add_groups('admin', [ROLE_ADMIN]) return root
def bootstrap_voteit(echo=True): """ Bootstrap site root. Will add: - Site root - Agenda template folder - Users folder - An administrative user with login: admin and pass: admin """ if echo: print "Bootstrapping site - creating 'admin' user with password 'admin'" #Add root root = createContent('SiteRoot', title = _(u"VoteIT"), creators = ['admin']) root.set_field_value('footer', u'<a href="http://www.voteit.se">www.voteit.se</a> — ' u'<a href="http://manual.voteit.se">User and developer manual</a> — ' u'<a href="https://github.com/VoteIT">Source code and bugtracker</a>') #Add users folder root['agenda_templates'] = createContent('AgendaTemplates', title = _(u"Agenda templates"), creators = ['admin']) #Add users folder root['users'] = createContent('Users', title = _(u"Registered users"), creators = ['admin']) users = root.users #Add user admin - note that creators also set owner, which is important for changing password admin = createContent('User', password = '******', creators = ['admin'], first_name = _(u'VoteIT'), last_name = _(u'Administrator')) users['admin'] = admin #Add admin to group managers root.add_groups('admin', [ROLE_ADMIN]) return root
def add_success(self, appstruct): #Don't save this data add_reject_proposal = appstruct.pop('add_reject_proposal', None) reject_proposal_title = appstruct.pop('reject_proposal_title', None) if add_reject_proposal: reject_proposal = createContent('Proposal', title = reject_proposal_title) name = reject_proposal.suggest_name(self.context) self.context[name] = reject_proposal appstruct['proposals'].add(reject_proposal.uid) obj = createContent(self.content_type, **appstruct) name = obj.suggest_name(self.context) self.context[name] = obj #Polls might have a special redirect action if the poll plugin has a settings schema if obj.get_poll_plugin().get_settings_schema() is not None: url = self.request.resource_url(obj, 'poll_config') else: url = self.request.resource_url(obj.__parent__, anchor = obj.uid) msg = _("private_poll_info", default = "The poll is created in private state, to show it the " "participants you have to change the state to upcoming.") self.api.flash_messages.add(msg) return HTTPFound(location = url)
def bootstrap_root(): root = createContent('SiteRoot', title='Progress') root['users'] = createContent('Users') #Create admin user with password admin as standard admin = createContent('User', password='******', first_name='Administrator') root['users']['admin'] = admin #Add admin to group managers #root.add_groups('admin', [security.ROLE_ADMIN]) #Create example project root['example-project'] = createContent('Project', title=_(u"Example project")) return root
def add(self): if 'cancel' in self.request.POST: url = resource_url(self.context, self.request) return HTTPFound(location=url) type = self.request.GET['type'] obj = createContent(type) schema = createSchema(obj.schemas['add']).bind(context = self.context, request = self.request) form = Form(schema, buttons=('save', 'cancel',)) self.register_form_resources(form) if 'save' in self.request.POST: controls = self.request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response obj.set_field_appstruct(appstruct) name = obj.suggest_name(self.context) self.context[name] = obj url = resource_url(self.context, self.request) return HTTPFound(location=url)
def add_invite_ticket(self, email, roles, sent_by = None): if email in self.invite_tickets: return obj = createContent('InviteTicket', email, roles, sent_by = sent_by) obj.__parent__ = self self.invite_tickets[email] = obj return obj
def add_form(self): post = self.request.POST if 'cancel' in post: self.api.flash_messages.add(_(u"Canceled")) url = resource_url(self.context, self.request) return HTTPFound(location=url) schema = createSchema('AddUserSchema') add_csrf_token(self.context, self.request, schema) schema = schema.bind(context=self.context, request=self.request, api = self.api) form = Form(schema, buttons=(button_add, button_cancel)) self.api.register_form_resources(form) if 'add' in post: controls = post.items() try: #appstruct is deforms convention. It will be the submitted data in a dict. appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response #Userid and name should be consistent name = appstruct['userid'] del appstruct['userid'] #creators takes care of setting the role owner as well as adding it to creators attr. obj = createContent('User', creators=[name], **appstruct) self.context[name] = obj self.api.flash_messages.add(_(u"Successfully added")) url = resource_url(self.context, self.request) return HTTPFound(location=url)
def agenda_template_select(self): #FIXME: Should this be a migrate script? try: agenda_templates = self.api.root['agenda_templates'] except KeyError: # pragma: no coverage obj = createContent('AgendaTemplates', title=_(u"Agenda templates"), creators=['admin']) agenda_templates = self.api.root['agenda_templates'] = obj get = self.request.GET if 'apply' in get: template_name = get['apply'] if template_name in agenda_templates: template = agenda_templates[template_name] template.populate_meeting(self.context) msg = _(u"agenda_template_apply_template_success", default=u"Selected template applied to meeting.") self.api.flash_messages.add(msg) return HTTPFound( location=resource_url(self.context, self.request)) else: err_msg = _( u"agenda_template_apply_invalid_template", default=u"No template named ${template} could be found.", mapping={'template': template_name}) self.api.flash_messages.add(err_msg, type="error") self.response['agenda_templates'] = agenda_templates return self.response
def test_metadata_for_query(self): from voteit.core.models.catalog import metadata_for_query catalog = self.root.catalog meeting = createContent('Meeting', title='Hello world!') self.root['m'] = meeting metadata = metadata_for_query(catalog, content_type='Meeting')[0] self.assertEqual(metadata['title'], "Hello world!")
def agenda_template_select(self): #FIXME: Should this be a migrate script? try: agenda_templates = self.api.root['agenda_templates'] except KeyError: # pragma: no coverage obj = createContent('AgendaTemplates', title = _(u"Agenda templates"), creators = ['admin']) agenda_templates = self.api.root['agenda_templates'] = obj get = self.request.GET if 'apply' in get: template_name = get['apply'] if template_name in agenda_templates: template = agenda_templates[template_name] template.populate_meeting(self.context) msg = _(u"agenda_template_apply_template_success", default = u"Selected template applied to meeting.") self.api.flash_messages.add(msg) return HTTPFound(location = resource_url(self.context, self.request)) else: err_msg = _(u"agenda_template_apply_invalid_template", default = u"No template named ${template} could be found.", mapping = {'template': template_name}) self.api.flash_messages.add(err_msg, type="error") self.response['agenda_templates'] = agenda_templates return self.response
def _add_mock_meeting(self): obj = createContent('Meeting', title = 'Testing catalog', description = 'To check that everything works as expected.', uid = 'simple_uid', creators = ['demo_userid']) obj.add_groups('admin', (security.ROLE_ADMIN, security.ROLE_MODERATOR,), event = False) self.root['meeting'] = obj return obj
def test_metadata_for_query(self): from voteit.core.models.catalog import metadata_for_query catalog = self.root.catalog meeting = createContent('Meeting', title = 'Hello world!') self.root['m'] = meeting metadata = metadata_for_query(catalog, content_type = 'Meeting')[0] self.assertEqual(metadata['title'], "Hello world!")
def test_resolve_catalog_docid(self): from voteit.core.models.catalog import resolve_catalog_docid catalog = self.root.catalog meeting = createContent('Meeting') self.root['m'] = meeting docid = catalog.query("content_type == 'Meeting'")[1][0] self.assertEqual(meeting, resolve_catalog_docid(catalog, self.root, docid))
def add_invite_ticket(self, email, roles, sent_by=None): if email in self.invite_tickets: return obj = createContent('InviteTicket', email, roles, sent_by=sent_by) obj.__parent__ = self self.invite_tickets[email] = obj return obj
def process_meeting_structure(self, new_meeting, ignore_attributes): for ai in self.context.get_content(content_type = 'AgendaItem'): new_ai = createContent('AgendaItem') for (k, v) in ai.field_storage.items(): if k in ignore_attributes: continue new_ai.field_storage[k] = v new_meeting[ai.__name__] = new_ai self.process_ai(ai, new_ai, ignore_attributes)
def test_indexed_on_add(self): title_index = self.root.catalog['title'] title_count = title_index.documentCount() meeting = createContent('Meeting') meeting.title = 'hello world' self.root['meeting'] = meeting self.assertEqual(title_index.documentCount(), title_count + 1)
def add(self, context_uid, message, tags=(), context=None): obj = createContent('FeedEntry', context_uid, message, tags=tags) for i in range(10): k = self._next_free_key() if self.feed_storage.insert(k, obj): return raise KeyError("Couln't find a free key for feed handler after 10 retries.") # pragma : no cover
def register(self, appstruct): appstruct.pop('token', None) #Remove if it exists name = appstruct.pop('userid') use_profile_image = appstruct.pop('use_profile_image', True) if use_profile_image and 'profile_image_plugin' not in appstruct: #Ie allowed and not passed along appstruct['profile_image_plugin'] = self.name #Same as plugin name so far! obj = createContent('User', creators=[name], **appstruct) self.context.users[name] = obj self.set_auth_domain(obj, self.name) return obj
def poll_plugins_choices_widget(node, kw): request = kw['request'] #Add all selectable plugins to schema. This chooses the poll method to use plugin_choices = set() #FIXME: The new object should probably be sent to construct schema #for now, we can fake this fake_poll = createContent('Poll') for (name, plugin) in request.registry.getAdapters([fake_poll], IPollPlugin): plugin_choices.add((name, plugin.title)) return deform.widget.CheckboxChoiceWidget(values=plugin_choices)
def add(self, context_uid, message, tags=(), userid=None, scripted=None): obj = createContent('LogEntry', context_uid, message, tags=tags, userid=userid, scripted=scripted) for i in range(10): k = self._next_free_key() if self.log_storage.insert(k, obj): return raise KeyError("Couln't find a free key for logging handler after 10 retries.") #pragma : no cover
def test_index_object_preforms_reindex_if_object_already_indexed(self): from voteit.core.models.catalog import index_object catalog = self.root.catalog meeting = createContent('Meeting') meeting.title = 'hello world' self.root['meeting'] = meeting meeting.title = 'something new' #This should now preform reindex instead index_object(catalog, meeting) self.assertEqual(catalog.query("title == 'something new'")[0], 1)
def process_ai(self, ai, new_ai, ignore_attributes): #FIXME: This should be dynamic later on for obj in ai.get_content(content_type = 'Proposal'): new_obj = createContent('Proposal') for (k, v) in obj.field_storage.items(): if k in ignore_attributes: continue new_obj.field_storage[k] = v if hasattr(obj, '__tags__'): new_obj.__tags__ = deepcopy(obj.__tags__) new_ai[obj.__name__] = new_obj
def new_request_password_token(self, request): """ Set a new request password token and email user. """ locale = get_localizer(request) self.__token__ = createContent('RequestPasswordToken') pw_link = "%stoken_pw?token=%s" % (resource_url(self, request), self.__token__()) html = render_view_action(self, request, 'email', 'request_password', pw_link = pw_link) msg = Message(subject=_(u"Password reset request from VoteIT"), recipients=[self.get_field_value('email')], html = html) mailer = get_mailer(request) mailer.send(msg)
def add_form(self): content_type = self.request.params.get('content_type') tag = self.request.GET.get('tag', None) #Permission check add_permission = self.api.content_types_add_perm(content_type) if not has_permission(add_permission, self.context, self.request): raise HTTPForbidden( "You're not allowed to add '%s' in this context." % content_type) factory = self.api.get_content_factory(content_type) schema_name = self.api.get_schema_name(content_type, 'add') schema = createSchema(schema_name).bind(context=self.context, request=self.request, api=self.api) form = Form(schema, buttons=(button_add, button_cancel)) self.api.register_form_resources(form) if content_type == 'AgendaItem': self.response['tabs'] = self.api.render_single_view_component( self.context, self.request, 'tabs', 'manage_agenda') post = self.request.POST if 'add' in post: controls = post.items() try: #appstruct is deforms convention. It will be the submitted data in a dict. appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response kwargs = {} kwargs.update(appstruct) if self.api.userid: kwargs['creators'] = [self.api.userid] obj = createContent(content_type, **kwargs) name = self.generate_slug(obj.title) self.context[name] = obj self.api.flash_messages.add(_(u"Successfully added")) #Success, redirect url = self.request.resource_url(obj) #Polls might have a special redirect action if the poll plugin has a settings schema: if content_type == 'Poll': if obj.get_poll_plugin().get_settings_schema() is not None: url += 'poll_config' else: url = self.request.resource_url(obj.__parent__, anchor=obj.uid) msg = _( u"private_poll_info", default= u"The poll is created in private state, to show it the participants you have to change the state to upcoming." ) self.api.flash_messages.add(msg) return HTTPFound(location=url)
def test_reindexed_on_update(self): meeting = createContent('Meeting') meeting.title = 'hello world' self.root['meeting'] = meeting query = self.query self.assertEqual(query("title == 'hello world'")[0], 1) self.root['meeting'].title = 'me and my little friends' #We'll have to kick the subscriber manually objectEventNotify(ObjectUpdatedEvent(self.root['meeting'])) self.assertEqual(query("title == 'hello world'")[0], 0) self.assertEqual(query("title == 'me and my little friends'")[0], 1)
def _add_mock_meeting(self): obj = createContent( 'Meeting', title='Testing catalog', description='To check that everything works as expected.', uid='simple_uid', creators=['demo_userid']) obj.add_groups('admin', ( security.ROLE_ADMIN, security.ROLE_MODERATOR, ), event=False) self.root['meeting'] = obj return obj
def discussion_answer(self): content_type = 'DiscussionPost' ai = find_interface(self.context, IAgendaItem) add_permission = self.api.content_types_add_perm(content_type) if not has_permission(add_permission, ai, self.request): raise HTTPForbidden("You're not allowed to add '%s' in this context." % content_type) schema_name = self.api.get_schema_name(content_type, 'add') schema = createSchema(schema_name).bind(context = self.context, request = self.request, api = self.api) url = self.request.resource_url(self.context, 'answer') form = Form(schema, action=url, buttons=(button_add,), formid="answer-form-%s" % self.context.uid, use_ajax=False, ajax_options=ajax_options) self.api.register_form_resources(form) self.response['user_image_tag'] = self.api.user_profile.get_image_tag(request = self.request) self.response['content_type'] = content_type post = self.request.POST if 'add' in post: controls = post.items() try: #appstruct is deforms convention. It will be the submitted data in a dict. appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() if self.request.is_xhr: return Response(render("templates/ajax_edit.pt", self.response, request = self.request)) return self.response kwargs = {} kwargs['text'] = appstruct['text'] if self.api.userid: kwargs['creators'] = [self.api.userid] ai = find_interface(self.context, IAgendaItem) obj = createContent(content_type, **kwargs) name = generate_slug(ai, obj.title) ai[name] = obj #Success, redirect url = self.request.resource_url(ai, anchor=obj.uid) if self.request.is_xhr: return Response(headers = [('X-Relocate', url)]) return HTTPFound(location=url)
def register(self): """ Register and log in a user. Be sure to catch came_from since ticket system will use that url to send people who've been invited but haven't registered yet to this view. """ browser_result = self.browser_check() if browser_result: return browser_result schema = createSchema('RegisterUserSchema').bind(context=self.context, request=self.request, api=self.api) form = deform.Form(schema, buttons=(button_register, )) self.api.register_form_resources(form) appstruct = {} POST = self.request.POST users = self.context.users if 'register' in POST: controls = POST.items() try: appstruct = form.validate(controls) except deform.ValidationFailure, e: self.response['form'] = e.render() return self.response #Userid and name should be consistent - and not stored name = appstruct['userid'] del appstruct['userid'] #Came from should not be stored either came_from = urllib.unquote(appstruct['came_from']) if came_from == u'/': came_from = None del appstruct['came_from'] obj = createContent('User', creators=[name], **appstruct) self.context.users[name] = obj headers = remember(self.request, name) # login user if came_from: msg = _(u"You're now registered. Welcome!") self.api.flash_messages.add(msg) return HTTPFound(location=came_from, headers=headers) msg = _( u"joined_without_ticket_intro_text", default=u"You're now registered. Welcome! " u"Please take some time to update your profile and write something about yourself. " u"To join a meeting, you need to either have an invitaion that will have been sent " u"to you via email, or the url of a meeting to request access to it." ) self.api.flash_messages.add(msg) return HTTPFound(location=self.request.resource_url(obj), headers=headers)
def _fixture(self): from voteit.core.testing_helpers import register_catalog from voteit.core.testing_helpers import bootstrap_and_fixture from voteit.core.security import ROLE_VIEWER self.config.scan('voteit.core.models') self.config.testing_securitypolicy(userid='jane') register_catalog(self.config) root = bootstrap_and_fixture(self.config) root['m'] = meeting = createContent('Meeting') root['users']['jane'] = createContent('User') root['users']['tarzan'] = createContent('User') meeting.set_groups('jane', [ROLE_VIEWER], event = True) meeting.set_groups('tarzan', [ROLE_VIEWER], event = True) meeting['d'] = createContent('DiscussionPost', creators = ['jane']) meeting['d2'] = createContent('DiscussionPost', creators = ['jane']) meeting['poll'] = createContent('Poll') meeting['poll']['v'] = createContent('Vote', creators = ['jane']) meeting['p'] = createContent('Proposal', creators = ['jane']) meeting['p2'] = createContent('Proposal', creators = ['tarzan']) return root
def test_update_indexes_when_index_removed(self): meeting = createContent('Meeting') meeting.title = 'hello world' self.root['meeting'] = meeting catalog = self.root.catalog catalog['nonexistent_index'] = catalog['title'] #Nonexistent should be removed del catalog['title'] #Removing title index should recreate it self.failUnless(catalog.get('nonexistent_index')) from voteit.core.models.catalog import update_indexes update_indexes(catalog, reindex=False) self.failIf(catalog.get('nonexistent_index')) self.failUnless(catalog.get('title'))
def test_reindex_indexes(self): meeting = createContent('Meeting') meeting.title = 'hello world' self.root['meeting'] = meeting catalog = self.root.catalog #Catalog should return the meeting on a search self.assertEqual(self.query("title == 'hello world'")[0], 1) #If the meeting title changes, no subscriber will be fired here... meeting.title = "Goodbye cruel world" #...but when reindexed it should work from voteit.core.models.catalog import reindex_indexes reindex_indexes(catalog) self.assertEqual(self.query("title == 'Goodbye cruel world'")[0], 1)
def add(self, context_uid, message, tags=(), userid=None, scripted=None): obj = createContent('LogEntry', context_uid, message, tags=tags, userid=userid, scripted=scripted) for i in range(10): k = self._next_free_key() if self.log_storage.insert(k, obj): return raise KeyError( "Couln't find a free key for logging handler after 10 retries." ) #pragma : no cover
def rec_to_discussions_form(self): """ Note: This is far from finished, don't use this unless you really know what you're doing! """ schema = createSchema('PopulateFromRecommendationsSchema') add_csrf_token(self.context, self.request, schema) schema = schema.bind(context = self.context, request = self.request, api = self.api) form = deform.Form(schema, buttons=(button_save,)) self.api.register_form_resources(form) post = self.request.POST if 'save' in post: controls = post.items() try: appstruct = form.validate(controls) except deform.ValidationFailure, e: self.response['form'] = e.render() return self.response adjust_wf = appstruct['adjust_wf'] group = appstruct['group'] userid = appstruct['userid'] dry_run = appstruct['dry_run'] created_discussion_posts = 0 wf_adjusted_proposals = 0 proposals_and_rec = self.get_proposals_and_rec(group) handled_props = len(proposals_and_rec) for (prop, rec) in proposals_and_rec: if rec['text']: created_discussion_posts += 1 text = "%s\n%s" % (rec['text'], u" ".join([u'#%s' % x for x in prop.get_tags()])) post = createContent('DiscussionPost', creators = [userid], text = text) name = post.suggest_name(prop.__parent__) prop.__parent__[name] = post if rec['state'] and adjust_wf: wf_adjusted_proposals += 1 prop.workflow.initialize(prop) prop.set_workflow_state(self.request, rec['state']) self.api.flash_messages.add(_(u"Done - handled ${count} proposals", mapping = {'count': handled_props})) self.api.flash_messages.add(_(u"${count} new discussion posts added", mapping = {'count': created_discussion_posts})) if wf_adjusted_proposals: self.api.flash_messages.add(_(u"${count} proposals workflow adjusted", mapping = {'count': wf_adjusted_proposals})) if dry_run: from transaction import abort abort() self.api.flash_messages.add(_(u"DRY RUN - transaction aborted and nothing saved!")) return HTTPFound(location = self.request.resource_url(self.context))
def add_meeting(self): """ Custom view used when adding meetings. FIXME: We may want to use custom callbacks on add instead, rather than lots of hacks in views. """ content_type = self.request.params.get('content_type') #Permission check add_permission = self.api.content_types_add_perm(content_type) if not has_permission(add_permission, self.context, self.request): raise HTTPForbidden( "You're not allowed to add '%s' in this context." % content_type) factory = self.api.get_content_factory(content_type) schema_name = self.api.get_schema_name(content_type, 'add') schema = createSchema(schema_name) add_csrf_token(self.context, self.request, schema) schema = schema.bind(context=self.context, request=self.request, api=self.api) form = Form(schema, buttons=(button_add, button_cancel)) self.api.register_form_resources(form) post = self.request.POST if 'add' in post: controls = post.items() try: #appstruct is deforms convention. It will be the submitted data in a dict. appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response copy_users_and_perms = appstruct['copy_users_and_perms'] del appstruct['copy_users_and_perms'] kwargs = {} kwargs.update(appstruct) if self.api.userid: kwargs['creators'] = [self.api.userid] obj = createContent(content_type, **kwargs) name = self.generate_slug(obj.title) self.context[name] = obj if copy_users_and_perms: obj.copy_users_and_perms(copy_users_and_perms) self.api.flash_messages.add( _(u"Users and their permissions successfully copied")) else: self.api.flash_messages.add(_(u"Successfully added")) #Success, redirect url = self.request.resource_url(obj) return HTTPFound(location=url)
def process_inline_add_form(self): """ Inline add form. Note the somewhat odd permissions on the view configuration. The actual permission check for each content type is preformed later. """ content_type = self.request.GET['content_type'] add_permission = self.api.content_types_add_perm(content_type) if not has_permission(add_permission, self.context, self.request): raise HTTPForbidden("You're not allowed to add '%s' in this context." % content_type) bind_data = dict(context = self.context, request = self.request, api = self.api) form = inline_add_form(self.api, content_type, bind_data) post = self.request.POST if 'add' in post: controls = post.items() try: #appstruct is deforms convention. It will be the submitted data in a dict. appstruct = form.validate(controls) except ValidationFailure, e: msg = self.api.translate(_(u"There were errors so your post hasn't been submitted yet.")) html = u""" <script type="text/javascript"> flash_message("%s", 'error', true, 3, true); </script> """ % msg html += e.render() return Response(html) kwargs = {} kwargs.update(appstruct) if self.api.userid: kwargs['creators'] = [self.api.userid] obj = createContent(content_type, **kwargs) name = generate_slug(self.context, obj.title) self.context[name] = obj #Prep js response tag = self.request.GET.get('tag', '') url = self.request.resource_url(self.context, query = {'tag': tag}) if content_type == 'Proposal': area = 'proposals' else: area = 'discussions' txt = self.api.translate(_(u"Posting...")) response = '<div><img src="/static/images/spinner.gif" />%s</div>' % txt response += '<script type="text/javascript">' response += "reload_ai_listings('%s', ['%s']);" % (url, area) response += "mark_as_read();" response += '</script>' return Response(response)
def test_update_indexes_when_index_removed(self): meeting = createContent('Meeting') meeting.title = 'hello world' self.root['meeting'] = meeting catalog = self.root.catalog catalog['nonexistent_index'] = catalog[ 'title'] #Nonexistent should be removed del catalog['title'] #Removing title index should recreate it self.failUnless(catalog.get('nonexistent_index')) from voteit.core.models.catalog import update_indexes update_indexes(catalog, reindex=False) self.failIf(catalog.get('nonexistent_index')) self.failUnless(catalog.get('title'))
def create_reject_proposal(self): add_reject_proposal = self.get_field_value('add_reject_proposal', None) reject_proposal_uid = self.get_field_value('reject_proposal_uid', None) #Only add if it doesn't exist. if add_reject_proposal and reject_proposal_uid is None: proposal_title = self.get_field_value('reject_proposal_title') proposal = createContent('Proposal', title=proposal_title) self.set_field_value('reject_proposal_uid', proposal.uid) # add rejection proposal to agenda item agenda_item = find_interface(self, IAgendaItem) name = generate_slug(agenda_item, proposal.title) agenda_item[name] = proposal # add proposal to polls proposal uids proposal_uids = set(self.proposal_uids) proposal_uids.add(proposal.uid) self.proposal_uids = proposal_uids
def create_reject_proposal(self): add_reject_proposal = self.get_field_value('add_reject_proposal', None) reject_proposal_uid = self.get_field_value('reject_proposal_uid', None) #Only add if it doesn't exist. if add_reject_proposal and reject_proposal_uid is None: proposal_title = self.get_field_value('reject_proposal_title') proposal = createContent('Proposal', title = proposal_title) self.set_field_value('reject_proposal_uid', proposal.uid) # add rejection proposal to agenda item agenda_item = find_interface(self, IAgendaItem) name = generate_slug(agenda_item, proposal.title) agenda_item[name] = proposal # add proposal to polls proposal uids proposal_uids = set(self.proposal_uids) proposal_uids.add(proposal.uid) self.proposal_uids = proposal_uids
def register(self): """ Register and log in a user. Be sure to catch came_from since ticket system will use that url to send people who've been invited but haven't registered yet to this view. """ browser_result = self.browser_check() if browser_result: return browser_result schema = createSchema('RegisterUserSchema').bind(context=self.context, request=self.request, api=self.api) form = deform.Form(schema, buttons=(button_register,)) self.api.register_form_resources(form) appstruct = {} POST = self.request.POST users = self.context.users if 'register' in POST: controls = POST.items() try: appstruct = form.validate(controls) except deform.ValidationFailure, e: self.response['form'] = e.render() return self.response #Userid and name should be consistent - and not stored name = appstruct['userid'] del appstruct['userid'] #Came from should not be stored either came_from = urllib.unquote(appstruct['came_from']) if came_from == u'/': came_from = None del appstruct['came_from'] obj = createContent('User', creators=[name], **appstruct) self.context.users[name] = obj headers = remember(self.request, name) # login user if came_from: msg = _(u"You're now registered. Welcome!") self.api.flash_messages.add(msg) return HTTPFound(location=came_from, headers=headers) msg = _(u"joined_without_ticket_intro_text", default = u"You're now registered. Welcome! " u"Please take some time to update your profile and write something about yourself. " u"To join a meeting, you need to either have an invitaion that will have been sent " u"to you via email, or the url of a meeting to request access to it.") self.api.flash_messages.add(msg) return HTTPFound(location=self.request.resource_url(obj), headers=headers)
def add_form(self): content_type = self.request.params.get('content_type') tag = self.request.GET.get('tag', None) #Permission check add_permission = self.api.content_types_add_perm(content_type) if not has_permission(add_permission, self.context, self.request): raise HTTPForbidden("You're not allowed to add '%s' in this context." % content_type) factory = self.api.get_content_factory(content_type) schema_name = self.api.get_schema_name(content_type, 'add') schema = createSchema(schema_name).bind(context=self.context, request=self.request, api=self.api) form = Form(schema, buttons=(button_add, button_cancel)) self.api.register_form_resources(form) if content_type == 'AgendaItem': self.response['tabs'] = self.api.render_single_view_component(self.context, self.request, 'tabs', 'manage_agenda') post = self.request.POST if 'add' in post: controls = post.items() try: #appstruct is deforms convention. It will be the submitted data in a dict. appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response kwargs = {} kwargs.update(appstruct) if self.api.userid: kwargs['creators'] = [self.api.userid] obj = createContent(content_type, **kwargs) name = self.generate_slug(obj.title) self.context[name] = obj self.api.flash_messages.add(_(u"Successfully added")) #Success, redirect url = self.request.resource_url(obj) #Polls might have a special redirect action if the poll plugin has a settings schema: if content_type == 'Poll': if obj.get_poll_plugin().get_settings_schema() is not None: url += 'poll_config' else: url = self.request.resource_url(obj.__parent__, anchor = obj.uid) msg = _(u"private_poll_info", default = u"The poll is created in private state, to show it the participants you have to change the state to upcoming.") self.api.flash_messages.add(msg) return HTTPFound(location=url)
def add_meeting(self): """ Custom view used when adding meetings. FIXME: We may want to use custom callbacks on add instead, rather than lots of hacks in views. """ content_type = self.request.params.get('content_type') #Permission check add_permission = self.api.content_types_add_perm(content_type) if not has_permission(add_permission, self.context, self.request): raise HTTPForbidden("You're not allowed to add '%s' in this context." % content_type) factory = self.api.get_content_factory(content_type) schema_name = self.api.get_schema_name(content_type, 'add') schema = createSchema(schema_name) add_csrf_token(self.context, self.request, schema) schema = schema.bind(context=self.context, request=self.request, api=self.api) form = Form(schema, buttons=(button_add, button_cancel)) self.api.register_form_resources(form) post = self.request.POST if 'add' in post: controls = post.items() try: #appstruct is deforms convention. It will be the submitted data in a dict. appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response copy_users_and_perms = appstruct['copy_users_and_perms'] del appstruct['copy_users_and_perms'] kwargs = {} kwargs.update(appstruct) if self.api.userid: kwargs['creators'] = [self.api.userid] obj = createContent(content_type, **kwargs) name = self.generate_slug(obj.title) self.context[name] = obj if copy_users_and_perms: obj.copy_users_and_perms(copy_users_and_perms) self.api.flash_messages.add(_(u"Users and their permissions successfully copied")) else: self.api.flash_messages.add(_(u"Successfully added")) #Success, redirect url = self.request.resource_url(obj) return HTTPFound(location=url)
def add_form(self): post = self.request.POST if 'cancel' in post: self.api.flash_messages.add(_(u"Canceled")) url = resource_url(self.context, self.request) return HTTPFound(location=url) schema = createSchema('AddUserSchema') add_csrf_token(self.context, self.request, schema) schema = schema.bind(context=self.context, request=self.request, api=self.api) form = Form(schema, buttons=(button_add, button_cancel)) self.api.register_form_resources(form) if 'add' in post: controls = post.items() try: #appstruct is deforms convention. It will be the submitted data in a dict. appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response #Userid and name should be consistent name = appstruct['userid'] del appstruct['userid'] #creators takes care of setting the role owner as well as adding it to creators attr. obj = createContent('User', creators=[name], **appstruct) self.context[name] = obj self.api.flash_messages.add(_(u"Successfully added")) url = resource_url(self.context, self.request) return HTTPFound(location=url)
def poll_plugin_choices_widget(node, kw): context = kw['context'] request = kw['request'] # get avaible plugins from the meeting meeting = find_interface(context, IMeeting) available_plugins = meeting.get_field_value('poll_plugins', ()) #Add all selectable plugins to schema. This chooses the poll method to use plugin_choices = set() #FIXME: The new object should probably be sent to construct schema #for now, we can fake this fake_poll = createContent('Poll') # add avaible plugins the the choice set for name in available_plugins: #FIXME: we should probably catch if a plugin is no lnger avaible on the site plugin = request.registry.queryAdapter(fake_poll, name = name, interface = IPollPlugin) if plugin: plugin_choices.add((name, plugin.title)) # if no plugins was set in the meetings add the default plugin if any is set if not plugin_choices: name = request.registry.settings.get('default_poll_method', None) plugin = request.registry.queryAdapter(fake_poll, name = name, interface = IPollPlugin) if plugin: plugin_choices.add((name, plugin.title)) return deform.widget.SelectWidget(values=plugin_choices)
def populate_meeting(self, meeting): for item in self.get_field_value('agenda_items', ()): obj = createContent('AgendaItem', **item) slug = generate_slug(meeting, obj.title) meeting[slug] = obj
def facebook_register(self): schema = createSchema('CSORegisterUserSchema') add_csrf_token(self.context, self.request, schema) schema = schema.bind(context=self.context, request=self.request, api=self.api) form = Form(schema, buttons=( button_register, button_cancel, )) self.api.register_form_resources(form) if 'cancel' in self.request.POST: self.api.flash_messages.add(_(u"Canceled")) url = self.request.resource_url(self.api.root) return HTTPFound(location=url) if self.request.POST: post = dict(self.request.POST) oauth_userid = post['oauth_userid'] oauth_access_token = post['oauth_access_token'] came_from = post['came_from'] # Logged in user, connect auth token to user if self.api.userid: user = self.api.user_profile #check that no other user has this token already other_user = self.api.root.users.get_user_by_oauth_token( 'facebook', oauth_access_token) if other_user and user != other_user: raise Forbidden( _("Another user has already registered with this token." )) #setting domain stuff user.auth_domains['facebook'] = { 'oauth_userid': oauth_userid, 'oauth_access_token': oauth_access_token, } url = self.request.resource_url(user) return HTTPFound(location=url) else: # Find user with auth token and log it in user = self.api.root.users.get_user_by_oauth_token( 'facebook', oauth_access_token) if IUser.providedBy(user): headers = remember(self.request, user.__name__) url = self.request.resource_url(self.context) if came_from: url = urllib.unquote(came_from) return HTTPFound(location=url, headers=headers) if 'register' in self.request.POST: controls = self.request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response name = appstruct['userid'] del appstruct['userid'] # removing domain data from appstruct del appstruct['oauth_userid'] del appstruct['oauth_access_token'] # add facebook as selected profile image appstruct['profile_image_plugin'] = 'facebook_profile_image' del appstruct['came_from'] obj = createContent('User', creators=[name], **appstruct) self.context.users[name] = obj #setting domain stuff obj.auth_domains['facebook'] = { 'oauth_userid': oauth_userid, 'oauth_access_token': oauth_access_token, } headers = remember(self.request, name) # login user url = self.request.resource_url(self.api.root) if came_from: url = urllib.unquote(came_from) return HTTPFound(location=url, headers=headers) else: self.response['form'] = form.render(self.request.POST) return self.response
def openid_register(self): schema = createSchema('CSORegisterUserOpenIDSchema') add_csrf_token(self.context, self.request, schema) schema = schema.bind(context=self.context, request=self.request, api=self.api) form = Form(schema, buttons=( button_register, button_cancel, )) self.api.register_form_resources(form) if 'cancel' in self.request.POST: self.api.flash_messages.add(_(u"Canceled")) url = self.request.resource_url(self.api.root) return HTTPFound(location=url) if self.request.POST: post = dict(self.request.POST) openid_identifier = post['openid_identifier'] domain = post['domain'] userid = post['userid'] came_from = post['came_from'] # Logged in user, connect openid_identifier if self.api.userid: user = self.api.user_profile #check that no other user has this token already other_user = self.api.root.users.get_auth_domain_user( 'openid', 'openid_identifier', openid_identifier) if other_user and user != other_user: raise Forbidden( _("Another user has already registered with this identifier." )) #setting domain stuff user.auth_domains['openid'] = { 'openid_identifier': openid_identifier, 'domain': domain } url = self.request.resource_url(user) return HTTPFound(location=url) else: # Find user with auth token and log it in user = self.api.root.users.get_auth_domain_user( 'openid', 'openid_identifier', openid_identifier) if IUser.providedBy(user): headers = remember(self.request, user.__name__) url = self.request.resource_url(self.context) if came_from: url = urllib.unquote(came_from) return HTTPFound(location=url, headers=headers) if 'register' in self.request.POST: controls = self.request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure, e: self.response['form'] = e.render() return self.response userid = appstruct['userid'] email = appstruct['email'] first_name = appstruct['first_name'] last_name = appstruct['last_name'] obj = createContent('User', creators=[userid], email=email, first_name=first_name, last_name=last_name) self.context.users[userid] = obj #setting domain stuff obj.auth_domains['openid'] = { 'openid_identifier': openid_identifier, 'domain': domain } headers = remember(self.request, userid) # login user url = self.request.resource_url(self.api.root) if came_from: url = urllib.unquote(came_from) return HTTPFound(location=url, headers=headers) else: self.response['form'] = form.render(self.request.POST) return self.response
def test_view_meeting_userids(self): self._register_security_policies() #Must add a user to users folder too, otherwise the find_authorized_userids won't accept them as valid self.root['users']['demo_userid'] = createContent('User') obj = self._add_mock_meeting() self.assertEqual(self.search(view_meeting_userids='demo_userid')[0], 1)