Exemple #1
0
def widget_options(project, request):
    """
    Renders the options panel for a single widget
    """

    session = DBSession()

    form_id = request.matchdict.get('form_id', None)
    form = session.query(Form).filter(Form.project_id==project.id).filter(Form.id==form_id).first()

    widget_id = request.matchdict.get('widget_id', None)
    widget = session.query(Widget).filter(Widget.form==form).filter(Widget.id==widget_id).first()

    widget_controller = widget_controller_factory(widget)

    if request.method == 'POST':
        widget_controller.process_options(request)

    return dict(
        id=widget.id,
        type=widget.widget_type,
        options_html=widget_controller.options(request),
        widget_html=widget_controller.render(None, request),
        data=widget_controller.data(),
    )
Exemple #2
0
def widget_sort_order(project, request):
    """
    Reorder widgets by passing a list of widget
    ids named sort_order in the request
    """

    session = DBSession()

    form_id = request.matchdict.get('form_id', None)
    form = session.query(Form).filter(Form.project_id==project.id).filter(Form.id==form_id).first()

    if request.method == 'POST':
        session = DBSession()

        sort_order = request.params.getall('sort_order[]')

        positions = {}
        for idx, widget_id in enumerate(sort_order):
            positions[int(widget_id)] = idx

        for widget in form.widgets:
            # get the sort order for this widget
            # if it's not included in the submitted values
            # return the next position and add it back into
            # the submitted values
            sort_order = positions.get(widget.id, len(positions))
            positions[widget.id] = sort_order
       
            widget.sort_order = sort_order 
            session.add(widget)

    return {}
Exemple #3
0
def feedback(project, request):
    session = DBSession()

    item_id = request.matchdict.get('item_id',None)
    items = project.get_items_for_user(request.user)
    pending_items = [i for i in items if not i.submitted]
    completed_items = [i for i in items if i.submitted]

    if item_id:
        item = project.get_item_for_user(request.user, item_id)
    elif pending_items:
        item = pending_items[0]
    else:
        item = None

    if item is not None:
        item = project.get_item(item.id)
        feedback = session.query(FeedbackRecord).filter(FeedbackRecord.user==request.user).filter(FeedbackRecord.item==item).first()
    else:
        feedback = None

    item_controller = FormController(project.item_form)
    feedback_controller = FormController(project.feedback_form)

    if request.method == 'POST' and item:
        feedback_controller.validate_from_request(request)

        if feedback_controller.errors:
            request.session.flash('There was a problem with your feedback', 'errors')
        else:
            if not feedback:
                feedback = FeedbackRecord(project, request.user, item)
                session.add(feedback)
    
            feedback.update_submitted()
            feedback_controller.populate_record_from_request(feedback, request)
    
            request.session.flash('Feedback on %s submitted' % item.title, 'messages')
    
            # Once feedback is submitted, load the next
            # record from the top of the list
    
            if request.params.get('submit','') == 'save_and_next':
                return HTTPFound(
                    location=route_url('project:feedback', request, project_id=project.id)
                )
            else:
                return HTTPFound(
                    location=route_url('project:feedback:item', request, project_id=project.id, item_id=item.id)
                )

    return dict(
        pending_items=pending_items,
        completed_items=completed_items,
        item=item,
        item_values=item_controller.render_values(request, item),
        form_widgets=feedback_controller.render_widgets(request, feedback),
        project=project,
        responsive_layout=True,
    )
Exemple #4
0
    def delete(self):
        """
        Delete the widget
        """

        session = DBSession()
        session.delete(self.widget)
Exemple #5
0
def record(project, request):
    form_controller = FormController(project.item_form)

    record_id = request.matchdict.get("record_id", None)

    if record_id is not None:
        record = project.get_item(record_id)
    else:
        record = None

    if record and not record.reviewed:
        record.reviewed = True

    if request.method == "POST":
        title = request.params.get("title", "").strip()
        submit = request.params.get("submit", "")

        if not title and submit.find("finish") >= 0:
            return HTTPFound(location=route_url("project:feedback_form", request, project_id=project.id))

        elif not title:
            request.session.flash("%s Name or Title is required!" % project.item_name, "errors")

        elif title:
            form_controller = FormController(project.item_form)
            form_controller.validate_from_request(request)

            if form_controller.errors:
                request.session.flash("There was a problem with your submission", "errors")

            else:
                request.session.flash("%s saved!" % title, "messages")

                if record is None:
                    record = ItemRecord(project, title)

                record.title = title

                form_controller.populate_record_from_request(record, request)

                session = DBSession()
                session.add(record)
                session.flush()

                if submit.find("add") >= 0:
                    route = "project:record:add"
                elif submit.find("finish") >= 0:
                    route = "project:feedback_form"
                else:
                    route = "project:record"

                return HTTPFound(location=route_url(route, request, project_id=project.id, record_id=record.id))

    return dict(
        project=project,
        menu=project_menu(project, request, "records"),
        form_widgets=form_controller.render_widgets(request, record),
        record=record,
    )
Exemple #6
0
def get_temp_user():
    session = DBSession()

    user = User()
    session.add(user)
    session.flush()

    return user
Exemple #7
0
def record_collect_thanks(request):
    session = DBSession()
    collect_code = request.matchdict['collect_code']
    project = session.query(Project).filter(Project.collect_code == collect_code).first()

    return dict(
        project=project
    )
Exemple #8
0
def signup(request):
    user = request.user

    if user and not user.is_temporary():
        raise StandardError, "You may not signup while logged in"

    came_from = request.params.get('came_from', request.referer)
    login_url = route_url('auth:login', request)
    signup_url = route_url('auth:signup', request)
    home_url = route_url('home', request)

    if came_from in [login_url, signup_url, home_url]:
        came_from = route_url('project:list', request)

    name = request.params.get('name','')
    email = request.params.get('email','')
    password = request.params.get('password','')
    password_confirm = request.params.get('password_confirm','')

    if request.method == 'POST':
        if not (name and email and password and password_confirm):
            request.session.flash('Oops! Please complete all fields', 'signup_errors')
        elif get_user(email=email):
            request.session.flash('The e-mail address %s is already in use' % email, 'signup_errors')
        elif password != password_confirm:
            request.session.flash('Your passwords did not match', 'signup_errors')
        else:
            if user and user.is_temporary():
                # user is logged in with a temporary account
                # update the account information to transfer the current
                # project

                user.set_name(name)
                user.set_email(email)
                user.set_password(password)

                location = came_from

            else:
                user = User(email, name, password)
                location = came_from

            session = DBSession()
            session.add(user)
            session.flush()

            headers = remember(request, user.id)

            return HTTPFound(
                location=location,
                headers=headers
            )

    return dict(
        name=name,
        email=email,
        came_from=came_from
    )
Exemple #9
0
    def process_type_options(self, request):
        choices = request.params.getall('choices')
        label = request.params.get('label',None)

        self.widget.set_choices(choices)
        self.widget.label = label

        session = DBSession()
        session.add(self.widget)
Exemple #10
0
    def populate_record_from_request(self, record, request):
        session = DBSession()
        value = session.query(MultipleChoiceValue).filter(Value.record==record).filter(Value.widget==self.widget).first()

        if not value:
            value = MultipleChoiceValue(record, self.widget)
            
        value.set_value(request.params.get(self.field_id(), ''))
        session.add(value)
Exemple #11
0
def main():
    conf = appconfig('config:/home/cspot/webapps/cspot/cspot/development.ini', name='main')
    engine = engine_from_config(conf, 'sqlalchemy.')

    DBSession.configure(bind=engine)

    Base.metadata.bind = engine
    Base.metadata.bind.echo = True
    Base.metadata.drop_all(engine)
    Base.metadata.create_all(engine)
Exemple #12
0
    def get_users(self):
        """
        Return user.id, user.name, user.email, user_role.role
        """

        session = DBSession()

        roles = session.query(User.name, User.email, User.id, User.last_login, User.temporary, ProjectUserRole.role).join(ProjectUserRole.user).filter(ProjectUserRole.project==self)

        return roles
Exemple #13
0
    def populate_record_from_request(self, record, request):
        session = DBSession()
        value = (
            session.query(ParagraphTextValue).filter(Value.record == record).filter(Value.widget == self.widget).first()
        )

        if not value:
            value = ParagraphTextValue(record, self.widget)

        value.set_value(request.params.get(self.field_id(), ""))
        session.add(value)
Exemple #14
0
def get_user(user_id=None, email=None, password_reset_key=None):
    session = DBSession()

    if user_id:
        return session.query(User).filter(User.id==user_id).first()
    elif email:
        return session.query(User).filter(User.email==email.strip().lower()).first()
    elif password_reset_key:
        return session.query(User).filter(User.password_reset_key==password_reset_key).first()
    else:
        return None
Exemple #15
0
    def get_user_roles(self, user):
        """
        Return the role names for a user in the context
        of this project. Used by the authorization policy
        via role_finder
        """
        session = DBSession()

        roles = session.query(ProjectUserRole).filter(ProjectUserRole.project==self).filter(ProjectUserRole.user==user)
            
        return [r.role for r in roles.all()]
Exemple #16
0
def project_factory(request):
    """
    Generate a project from the project_id in the url
    """

    session = DBSession()
    project_id = request.matchdict.get('project_id', None)

    if project_id:
        return session.query(Project).filter(Project.id==project_id).first()
    else:
        return None
Exemple #17
0
def user_factory(request):
    """
    Generate a user from a profile url
    """

    session = DBSession()
    user_id = request.matchdict.get('user_id', None)

    if user_id:
        return session.query(User).filter(User.id==user_id).first()
    else:
        return request.user
Exemple #18
0
    def __init__(self, name, item_name, item_plural):
        self.name = name
        self.item_name = item_name
        self.item_plural = item_plural
        self.item_label = u"%s Name or Title" % item_name
        self.collect_code = str(uuid4())
        self.creation_date = datetime.now()

        session = DBSession()

        session.add(ItemForm(self))
        session.add(FeedbackForm(self))
Exemple #19
0
def project_delete(project, request):
    if request.method != 'POST' or \
       request.session.get_csrf_token() != request.POST['csrf_token']:
        return HTTPFound(
            location=route_url('project:settings',request,project_id=project.id)
        )
    else:
        session = DBSession()
        session.delete(project)
        request.session.flash('%s deleted' % project.name, 'mesages')
        return HTTPFound(
            location=route_url('project:list',request)
        )
Exemple #20
0
def file_download(project, request):
    """
    Download a file from a widget
    """

    session = DBSession()

    record_id = request.matchdict["record_id"]
    widget_id = request.matchdict["widget_id"]
    filename = request.matchdict["filename"]

    record = session.query(Record).filter(Record.project_id == project.id).filter(Record.id == record_id).first()
    widget = session.query(Widget).filter(Widget.id == widget_id).first()
    widget_controller = widget_controller_factory(widget)

    value = record.get_widget_value(widget)

    return widget_controller.download(value, filename, request)
Exemple #21
0
def widget_delete(project, request):
    """
    Delete a widget from the current form
    """

    session = DBSession()

    form_id = request.matchdict.get('form_id', None)
    form = session.query(Form).filter(Form.project_id==project.id).filter(Form.id==form_id).first()

    widget_id = request.matchdict.get('widget_id', None)
    widget = session.query(Widget).filter(Widget.form==form).filter(Widget.id==widget_id).first()

    session = DBSession()
    widget_controller = widget_controller_factory(widget)
    widget_controller.delete()

    return dict(
        id=widget.id,
    )
Exemple #22
0
    def populate_record_from_request(self, record, request):
        session = DBSession()
        value = session.query(FileUploadValue).filter(FileUploadValue.record==record).filter(FileUploadValue.widget==self.widget).first()

        if value:
            # Update the filenames based on the filenames
            # included in the request
            # XXX we should remove the files as well
            old_filenames = value.get_filenames()
            new_filenames = request.POST.getall(self.field_id() + '_filenames')

            # remove any filename that wasn't already part
            # of the value
            for filename in new_filenames:
                if filename not in old_filenames:
                    new_filenames.remove(filename)

            value.set_filenames(new_filenames)
    
        if self.field_id() in request.POST:
            for file_upload in request.POST.getall(self.field_id()):
                if hasattr(file_upload, 'filename'):

                    if not value:
                        value = FileUploadValue(record, self.widget)
                        session.add(value)
                        session.flush()

                    filename = file_upload.filename
                    file = file_upload.file
                
                    value.add_file(filename, file)
Exemple #23
0
def widget_add(project, request):
    """
    Adds a widget given a widget_type to the current
    form
    """

    session = DBSession()

    form_id = request.matchdict.get('form_id', None)
    form = session.query(Form).filter(Form.project_id==project.id).filter(Form.id==form_id).first()

    widget_type = request.params.get('widget_type', None)
    widget_model = widget_factory(widget_type)
    
    widget = widget_model(form, 'Untitled')
    session.add(widget)
    session.flush()

    widget_controller = widget_controller_factory(widget)

    return dict(
        id=widget.id,
        type=widget_type,
        widget_html=widget_controller.render(None, request),
        data=widget_controller.data(),
    )
Exemple #24
0
def main():
    conf = appconfig('config:/home/cspot/webapps/cspot/cspot/production.ini', name='main')
    engine = engine_from_config(conf, 'sqlalchemy.')

    DBSession.configure(bind=engine)
    session = DBSession()
    conn = session.connection()

    # conn.execute('alter table projects add reviewed')

    files = conn.execute("select id, filename from `values` where type = 'file'")

    for id, filename in files.fetchall():
        if filename:
            files = [filename]
        else:
            files = []

        conn.execute("update `values` set text_value = %s where id = %s", simplejson.dumps(files), id)
        print id, files

    mark_changed(session)
    transaction.commit()
Exemple #25
0
    def remove_user(self, user):
        """
        Remove a user from the project
        """
        session = DBSession()

        roles = session.query(ProjectUserRole).filter(ProjectUserRole.project==self).filter(ProjectUserRole.user==user)

        for role in roles.all():
            session.delete(role)

        session.flush()
Exemple #26
0
def record_collect(request):
    session = DBSession()

    collect_code = request.matchdict['collect_code']

    project = session.query(Project).filter(Project.collect_code == collect_code).first()

    form_controller = FormController(project.item_form)

    if request.method == 'POST':
        title = request.params.get('title', '').strip()
        submit = request.params.get('submit','')

        if not title and submit.find('finish') >= 0:
            return HTTPFound(
                location=route_url('project:collect', request, project_id=project.id)
            )

        elif not title:
            request.session.flash('%s Name or Title is required!' % project.item_name, 'errors')

        elif title:
            form_controller = FormController(project.item_form)
            form_controller.validate_from_request(request)

            if form_controller.errors:
                request.session.flash('There was a problem with your submission', 'errors')

            else:
                record = ItemRecord(project, title)
                record.title = title
                record.reviewed = False

                form_controller.populate_record_from_request(record, request)
    
                session.add(record)
                session.flush()
    
                return HTTPFound(
                    location=route_url('project:collect:thanks', request, collect_code=project.collect_code)
                )

    return dict(
        project=project,
        form_widgets=form_controller.render_widgets(request, None)
    )
Exemple #27
0
    def get_users_by_role(self, role):
        session = DBSession()

        roles = session.query(ProjectUserRole).filter(ProjectUserRole.project==self).filter(ProjectUserRole.role==role)

        return [r.user for r in roles]
Exemple #28
0
 def get_widget_value(self, widget):
     session = DBSession()
     return session.query(Value).filter(Value.record==self).filter(Value.widget==widget).first()
Exemple #29
0
def projects_add(request):
    """
    Add a project owned by the current user
   
    if a user is not logged in create a temporary user
    and associate the project with that user
    """

    session = DBSession()

    title = request.params.get('title','')
    template_id = request.params.get('template_id', '')
    item_plural = request.params.get('item_plural','').capitalize()

    templates = session.query(Project).filter(Project.template==True).all()

    if request.method == 'POST':

        if request.user and request.user.projects_remaining() <= 0:
            # Cannot add a project if you own more than 
            # your plan allows for.
            return HTTPFound(
                location=route_url('project:add', request)
            )

        if template_id != 'other':
            template = session.query(Project).filter(Project.template==True).filter(Project.id==template_id).first()
        else:
            template = None

        if not title:
            request.session.flash('Oops! Please complete all fields to continue', 'errors')

        elif template:
            # Create a new project from a template

            if not request.user:
                user = get_temp_user()
                headers = remember(request, user.id)
            else:
                user = request.user
                headers = None

            project = Project(title, 'item', 'items')
            project.add_user(user, 'owner')

            template.copy_to(project)

            for widget in template.item_form.widgets:
                widget_class = widget_factory(widget.widget_type)
                new_widget = widget_class(project.item_form, 'widget')
                widget.copy_to(new_widget)

            for widget in template.feedback_form.widgets:
                widget_class = widget_factory(widget.widget_type)
                new_widget = widget_class(project.feedback_form, 'widget')
                widget.copy_to(new_widget)

            session.add(project)
            session.flush() 

            return HTTPFound(
                location=route_url('project:records', request, project_id=project.id),
                headers=headers
            )

        elif item_plural:
            # Create a custom project from an item name

            item_name = plural_to_singular(item_plural)

            if not request.user:
                user = get_temp_user()
                headers = remember(request, user.id)
            else:
                user = request.user
                headers = None

            project = Project(title, item_name, item_plural)
            project.add_user(user, 'owner')

            documents_field = FileUploadWidget(project.item_form, 'Documents')

            rate_question = MultipleChoiceWidget(project.feedback_form, 'Rate this %s' % (project.item_name))
            rate_question.set_choices(['Very Good', 'Good', 'Average', 'Poor', 'Very Poor'])

            comments_question = ParagraphTextWidget(project.feedback_form, 'Comments')

            session.add(project)
            session.flush() 

            return HTTPFound(
                location=route_url('project:records', request, project_id=project.id),
                headers=headers
            )

    return dict(
        title=title,
        item_plural=item_plural,
        templates=templates,
    )
Exemple #30
0
    def process_type_options(self, request):
        label = request.params.get('label',None)
        self.widget.label = label

        session = DBSession()
        session.add(self.widget)