Beispiel #1
0
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> &mdash; '
        u'<a href="http://manual.voteit.se">User and developer manual</a> &mdash; '
        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
Beispiel #2
0
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> &mdash; '
                                   u'<a href="http://manual.voteit.se">User and developer manual</a> &mdash; '
                                   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
Beispiel #3
0
    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)
Beispiel #4
0
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
Beispiel #5
0
    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)
Beispiel #6
0
 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
Beispiel #7
0
    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)
Beispiel #8
0
    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!")
Beispiel #10
0
 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
Beispiel #11
0
 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
Beispiel #12
0
 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!")
Beispiel #13
0
 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))
Beispiel #14
0
 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 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))
Beispiel #16
0
 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)
Beispiel #18
0
 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
Beispiel #19
0
 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)
Beispiel #20
0
 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
Beispiel #21
0
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)
Beispiel #22
0
 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
Beispiel #23
0
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)
Beispiel #24
0
    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 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)
Beispiel #26
0
 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
Beispiel #27
0
 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)
Beispiel #28
0
 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
Beispiel #31
0
 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)
Beispiel #32
0
    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)
Beispiel #33
0
    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)
Beispiel #34
0
 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
Beispiel #35
0
 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'))
Beispiel #36
0
 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 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)
Beispiel #38
0
    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
Beispiel #39
0
    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))
Beispiel #40
0
 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)
Beispiel #41
0
 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'))
Beispiel #43
0
    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
Beispiel #44
0
 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
Beispiel #45
0
    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)
Beispiel #46
0
 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)
Beispiel #47
0
 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)
Beispiel #48
0
    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)
Beispiel #49
0
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)
Beispiel #50
0
 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
Beispiel #51
0
    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
Beispiel #52
0
    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)