Ejemplo n.º 1
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        # Validate the submitted email address
        submitted_email = self.request.get(u'email')
        if submitted_email == u'':
            error_msg = u'Email address must be specified'
        elif email_pattern.match(submitted_email):
            # Test whether ProjectUser entity for that email already exists
            if dao.test_email_in_project(project, submitted_email):
                error_msg = u'Already a member of this project: {}'.format(
                    submitted_email)
            else:
                # Attempt to add a new ProjectUser entity
                permissions = list()
                for permission in dao.get_all_project_permissions():
                    if self.request.get(permission):
                        permissions.append(permission)
                if not dao.test_project_permissions(project,
                                                    [dao.PROJECT_OWN]):
                    if dao.PROJECT_OWN in permissions:
                        webapp2.abort(401)
                try:
                    dao.ProjectUser(email=submitted_email.lower(),
                                    parent=project.key,
                                    permissions=permissions).put()
                    self.redirect(
                        "/project_admin/project_user_admin?project_id={}".
                        format(project.key.id()))
                    return
                except Exception as e:
                    error_msg = u'Adding user to project failed: {}'.format(e)
        else:
            error_msg = u'Invalid email: {}'.format(submitted_email)

        # Build list of permission checkboxes and whether they should be checked
        permissions = list()
        for project_permission in dao.get_all_project_permissions():
            permission = {
                u'name':
                project_permission,
                u'checked':
                u'checked' if self.request.get(project_permission) else u''
            }
            permissions.append(permission)

        # Display the webpage
        self.render(project, permissions, error_msg)
Ejemplo n.º 2
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        # Get specified ProjectUser entity
        project_user_id = self.request.get(u'project_user_id')
        project_user = dao.get_project_user_by_id(project, project_user_id)
        error_msg = None if project_user else u'Unable to access specified project user'

        # Handle delete request
        if project_user and self.request.get(u'delete'):
            try:
                self.require_owner(project, exclude_user=project_user)
                project_user.key.delete()
                self.redirect(
                    "/project_admin/project_user_admin?project_id={}".format(
                        project.key.id()))
                return
            except Exception as e:
                error_msg = u'Deleting project user failed: {}'.format(e)

        # Handle update request
        if project_user and self.request.get(u'update'):
            # Attempt to update the ProjectUser entity's permissions
            permissions = list()
            for permission in dao.get_all_project_permissions():
                if self.request.get(permission):
                    permissions.append(permission)
            if not dao.test_project_permissions(project, [dao.PROJECT_OWN]):
                if (dao.PROJECT_OWN in project_user.permissions
                        and dao.PROJECT_OWN not in permissions) or (
                            dao.PROJECT_OWN not in project_user.permissions
                            and dao.PROJECT_OWN in permissions):
                    webapp2.abort(401)
            project_user.permissions = permissions
            try:
                self.require_owner(project)
                project_user.put()
                self.redirect(
                    "/project_admin/project_user_admin?project_id={}".format(
                        project.key.id()))
                return
            except Exception as e:
                error_msg = u'Updating project user failed: {}'.format(e)

        # Display the webpage
        self.render(project, project_user_id, project_user, error_msg)
Ejemplo n.º 3
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        attachment = dao.get_attachment_by_id(
            project, self.request.get(u'attachment_id'))
        if not attachment:
            self.response.write(u'Download unsuccessful')

        blob_info = blobstore.BlobInfo.get(attachment.blob_key)
        if blob_info:
            try:
                # Set header so that we can write Unicode body; note that headers must be
                # byte strings, not unicode strings
                self.response.content_type = 'charset=utf-8'
                self.send_blob(attachment.blob_key,
                               save_as=attachment.filename)
                # Set header again, in case cleared by send_blob
                self.response.content_type = 'charset=utf-8'
                self.response.write(
                    u'Download successful')  # TODO Is this needed?
            except:
                self.response.write(u'Download unsuccessful')
        else:
            self.response.write(u'Download unsuccessful')
Ejemplo n.º 4
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'_project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        interview_service = InterviewService(project)
        interview_name = self.request.get(u'_interview_name')
        interview = interview_service.get_interview_by_name(interview_name)

        variable = dao.get_variable_by_internal_name(project, self.request.get(u'_variable_name'))

        index = self.request.get(u'_index')

        # Deliver HTTP response
        jinja_template = ui.get_template(self, u'project/upload_file.html')
        jinja_template_values = dao.get_standard_project_values(project)
        jinja_template_values[u'interview'] = interview
        jinja_template_values[u'variable'] = variable
        if index:
            jinja_template_values[u'show_index'] = True
            jinja_template_values[u'index'] = index

        jinja_template_values[u'upload_file_post_url'] = blobstore.create_upload_url('/project/upload_file_post')

        self.response.out.write(jinja_template.render(jinja_template_values))
Ejemplo n.º 5
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        variable_list = list()

        for variable_entity in dao.get_variables(project):
            variable = dict()
            variable[u'id'] = variable_entity.key.id()
            variable[u'name'] = variable_entity.name
            variable[u'description'] = variable_entity.description
            variable[u'is_repeating'] = variable_entity.is_repeating
            variable[u'input_field'] = variable_entity.input_field
            variable[u'assignments'] = self.get_assignments(project, variable)
            variable[u'documents'] = self.get_documents(project, variable)

            variable_list.append(variable)

        # Create template and template values, render the page
        jinja_template = ui.get_template(self, u'project/variable/index.html')

        jinja_template_values = dao.get_standard_project_values(project)
        jinja_template_values[u'variables'] = variable_list

        self.response.out.write(jinja_template.render(jinja_template_values))
Ejemplo n.º 6
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        # Display the webpage
        self.render(project)
Ejemplo n.º 7
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        name = self.request.get(u'name')
        description = self.request.get(u'description')
        doc_style = self.request.get(u'doc_style')

        if not name:
            error_msg = u'You must specify a name for your document definition'
        else:
            document_entity = dao.get_document_by_name(project, name)
            if document_entity:
                error_msg = u'Adding document failed: Duplicate document name in project'
            else:
                try:
                    document_entity = dao.Document(
                        name=name,
                        internal_name=dao.convert_name_to_internal_name(name),
                        description=description,
                        style_name=doc_style,
                        parent=project.key)
                    document_entity.put()
                    dao.touch_project_documents(project)
                    self.redirect("/project/document?project_id={}".format(
                        project.key.id()))
                    return
                except Exception as e:
                    error_msg = u'Adding document failed: {}'.format(e)

        # Display the webpage
        self.render(project, error_msg)
Ejemplo n.º 8
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        style_entity = dao.get_style_by_id(project, self.request.get(u'style_id'))
        error_msg = None if style_entity else u'Unable to access specified style'

        # Handle delete request
        if style_entity and self.request.get(u'delete'):
            try:
                style_entity.key.delete()
                dao.touch_project_documents(project)
                self.redirect("/project/style?project_id={}".format(project.key.id()))
                return
            except Exception as e:
                error_msg = u'Deleting style from project failed: {}'.format(e)

        # Handle update request
        if style_entity and self.request.get(u'update'):
            try:
                style_entity.description = self.request.get(u'description')
                style_entity.css = self.request.get(u'css')
                style_entity.put()
                dao.touch_project_documents(project)
                self.redirect("/project/style?project_id={}".format(project.key.id()))
                return
            except Exception as e:
                error_msg = u'Updating style failed: {}'.format(e)

        # Display the webpage
        self.render(project, style_entity, error_msg)
Ejemplo n.º 9
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        name = self.request.get(u'name')
        description = self.request.get(u'description')
        css = self.request.get(u'css')

        if not name:
            error_msg = u'You must specify a name for your style definition'
        else:
            style_entity = dao.get_style_by_name(project, name)
            if style_entity:
                error_msg = u'Adding style failed: Duplicate style name in project'
            else:
                try:
                    dao.Style(name=name, description=description, css=css, parent=project.key).put()
                    dao.touch_project_documents(project)
                    self.redirect("/project/style?project_id={}".format(project.key.id()))
                    return
                except Exception as e:
                    error_msg = u'Adding style failed: {}'.format(e)

        # Display the webpage
        self.render(project, error_msg)
Ejemplo n.º 10
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        name = self.request.get(u'name')
        description = self.request.get(u'description')
        variable_type = self.request.get(u'type')

        if not name:
            error_msg = u'You must specify a name for your assignment definition'
        elif not variable_type:
            error_msg = u'You must specify whether this is a single or repeating assignment'
        else:
            assignment_entity = dao.get_assignment_by_name(project, name)
            if assignment_entity:
                error_msg = u'Adding assignment failed: Duplicate assignment name in project'
            else:
                try:
                    assignment_entity = dao.Assignment(
                        name=name,
                        description=description,
                        is_repeating=(variable_type == u'repeating'),
                        parent=project.key)
                    assignment_entity.put()
                    dao.touch_project_assignments(project)
                    self.redirect("/project/assignment?project_id={}".format(
                        project.key.id()))
                    return
                except Exception as e:
                    error_msg = u'Adding assignment failed: {}'.format(e)

        # Display the webpage
        self.render(project, error_msg)
Ejemplo n.º 11
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        jinja_template = ui.get_template(self, u'project/index.html')
        jinja_template_values = dao.get_standard_project_values(project)
        self.response.out.write(jinja_template.render(jinja_template_values))
Ejemplo n.º 12
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        attachment_entity = dao.get_attachment_by_id(
            project, self.request.get(u'attachment_id'))
        error_msg = None if attachment_entity else u'Unable to access specified attachment'

        # Handle delete request
        if attachment_entity and self.request.get(u'delete'):
            try:
                attachment_entity.key.delete()
                self.redirect(
                    "/project_admin/attachment_admin?project_id={}".format(
                        project.key.id()))
                return
            except Exception as e:
                error_msg = u'Deleting attachment from project failed: {}'.format(
                    e)

        # Handle update request
        if attachment_entity and self.request.get(u'update'):
            try:
                attachment_entity.description = self.request.get(
                    u'description')
                attachment_entity.attachment_type = self.request.get(
                    u'attachment_type')
                if self.request.get(u'choose_from_dropbox'):
                    # For Choose from Dropbox, we can transfer the file to the blob store, then return here
                    value = self.fill(self.request.get(u'choose_from_dropbox'))
                    filename = urllib2.unquote(value.split(u'/')[-1])
                    blob_key = DropboxService().store_file_as_blob(value)
                    dao.set_attachment_blob_key(attachment_entity, blob_key,
                                                filename)
                attachment_entity.put()
                self.redirect(
                    "/project_admin/attachment_admin?project_id={}".format(
                        project.key.id()))
                return
            except Exception as e:
                error_msg = u'Updating document failed: {}'.format(e)

        if self.request.get(u'choose_from_disk'):
            # For Choose from Disk, we need to redirect to another page
            query_string_dict = {
                u'name': attachment_entity.name,
                u'project_id': project.key.id(),
                u'attachment_id': attachment_entity.key.id()
            }
            query_string = urllib.urlencode(query_string_dict)
            self.redirect(
                "/project_admin/attachment_upload?{}".format(query_string))
            return

        # Display the webpage
        self.render(project, attachment_entity, error_msg)
Ejemplo n.º 13
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        style_entity = dao.get_style_by_id(project, self.request.get(u'style_id'))
        error_msg = None if style_entity else u'Unable to access specified style'

        # Display the webpage
        self.render(project, style_entity, error_msg)
Ejemplo n.º 14
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        attachment = dao.get_attachment_by_id(
            project, self.request.get(u'attachment_id'))

        # Display the webpage
        self.render(project, attachment)
Ejemplo n.º 15
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)
        error_msg = None

        # Handle delete request
        if self.request.get(u'delete'):
            if not dao.test_project_permissions(project, [dao.PROJECT_OWN]):
                webapp2.abort(401)
            try:
                dao.delete_project(project)
                self.redirect("/")
                return
            except Exception as e:
                error_msg = u'Deleting project failed: {}'.format(e)

        # Handle update request
        if self.request.get(u'update'):
            current_user = users.get_current_user()
            current_email = current_user.email().lower()
            try:
                name = self.request.get(u'name').strip()
                if name != project.name:
                    if not name:
                        raise Exception(u'You must provide a name for your project')
                    for test_project in dao.get_projects_by_name(name):
                        if dao.test_email_is_project_owner(test_project, current_email):
                            raise Exception(u'Sorry, you already own a different project named \"{}\"'.format(name))
                    project.name = name
                project.description = self.request.get(u'description')
                project.put()
                self.redirect("/project?project_id={}".format(project.key.id()))
                return
            except Exception as e:
                error_msg = u'Updating project failed: {}'.format(e)

        # Display the webpage
        self.render(project, error_msg)
Ejemplo n.º 16
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        # Create template and template values, render the page
        jinja_template = ui.get_template(
            self, u'project_admin/project_user_admin.html')

        jinja_template_values = dao.get_standard_project_values(project)
        jinja_template_values[u'users'] = dao.get_project_users(project)

        self.response.out.write(jinja_template.render(jinja_template_values))
Ejemplo n.º 17
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        # Build list of permission checkboxes and whether they should be checked
        permissions = list()
        for project_permission in dao.get_all_project_permissions():
            permissions.append({u'name': project_permission, u'checked': u''})

        # Display the webpage
        self.render(project, permissions)
Ejemplo n.º 18
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        # Get specified ProjectUser entity
        project_user_id = self.request.get(u'project_user_id')
        project_user = dao.get_project_user_by_id(project, project_user_id)
        error_msg = None if project_user else u'Unable to access specified project user'

        # Display the webpage
        self.render(project, project_user_id, project_user, error_msg)
Ejemplo n.º 19
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        name = self.request.get(u'name')
        description = self.request.get(u'description')

        if not name:
            error_msg = u'You must specify a name for your attachment'
        else:
            attachment = dao.get_attachment_by_name(project, name)
            if attachment:
                error_msg = u'Adding attachment failed: Duplicate attachment name in project'
            else:
                try:
                    attachment = dao.Attachment(name=name,
                                                description=description,
                                                parent=project.key)
                    if self.request.get(u'choose_from_dropbox'):
                        # For Choose from Dropbox, we can transfer the file to the blob store, then return here
                        value = self.fill(
                            self.request.get(u'choose_from_dropbox'))
                        filename = urllib2.unquote(value.split(u'/')[-1])
                        blob_key = DropboxService().store_file_as_blob(value)
                        dao.set_attachment_blob_key(attachment, blob_key,
                                                    filename)
                    attachment.put()
                    if self.request.get(u'choose_from_disk'):
                        # For Choose from Disk, we need to redirect to another page
                        query_string_dict = {
                            u'name': name,
                            u'project_id': project.key.id(),
                            u'attachment_id': attachment.key.id()
                        }
                        query_string = urllib.urlencode(query_string_dict)
                        self.redirect(
                            "/project_admin/attachment_upload?{}".format(
                                query_string))
                        return
                    self.redirect(
                        "/project_admin/attachment_admin?project_id={}".format(
                            project.key.id()))
                    return
                except Exception as e:
                    error_msg = u'Adding attachment failed: {}'.format(e)

        # Display the webpage
        self.render(project, error_msg, name, description)
Ejemplo n.º 20
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        interview_service = InterviewService(project)

        assignments = dict()
        for interview_name in interview_service.get_root_interview_names():
            match = interview_name_pattern.match(interview_name)
            if match:
                interview = interview_service.get_interview_by_name(
                    interview_name)
                interview_type = match.group(1)
                assignment_name = match.group(2)
                if assignment_name in assignments:
                    assignment = assignments[assignment_name]
                else:
                    assignment = dict()
                    assignment[u'name'] = assignment_name
                    assignments[assignment_name] = assignment
                if interview_type == "assign_writer":
                    assignment["assign_writer_interview_name"] = interview.name
                elif interview_type == "assign_reviewer":
                    assignment[
                        "assign_reviewer_interview_name"] = interview.name
                elif interview_type == "write":
                    assignment["ready_to_review"] = interview.completed
                    checklist_info = self.get_checklist_info(interview)
                    assignment["draft_status"] = u'Draft completed: {}'.format(
                        checklist_info
                    ) if interview.completed else u'Draft not completed'
                    assignment["write_interview_name"] = interview.name
                    assignment[
                        "writer"] = interview.assigned_email if interview.assigned_email else u'(not assigned yet)'
                elif interview_type == "review":
                    checklist_info = self.get_checklist_info(interview)
                    assignment[
                        "review_status"] = u'Review completed: {}'.format(
                            checklist_info
                        ) if interview.completed else u'Review not completed'
                    assignment["review_interview_name"] = interview.name
                    assignment[
                        "reviewer"] = interview.assigned_email if interview.assigned_email else u'(not assigned yet)'

        # Display the webpage
        self.render(project, assignments.values())
Ejemplo n.º 21
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        attachment = dao.get_attachment_by_id(
            project, self.request.get(u'attachment_id'))

        blobs_info = self.get_uploads(u'upload_file')
        if blobs_info:
            blob_info = blobs_info[0]
            dao.set_attachment_blob_key(attachment, blob_info.key(),
                                        blob_info.filename)

        self.redirect("/project_admin/attachment_admin?project_id={}".format(
            project.key.id()))
Ejemplo n.º 22
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        document = dao.get_document_by_id(project,
                                          self.request.get(u'document_id'))
        html_document = self.generate_html_document(project, document)
        html_document = self.replace_image_elements(project, html_document)

        # Deliver HTTP response
        jinja_template = ui.get_template(self,
                                         u'project/produce_document.html')
        jinja_template_values = dao.get_standard_project_values(project)
        jinja_template_values[u'document'] = document
        jinja_template_values[u'html_document'] = html_document
        self.response.out.write(jinja_template.render(jinja_template_values))
Ejemplo n.º 23
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        attachment = dao.get_attachment_by_id(
            project, self.request.get(u'attachment_id'))

        # Deliver HTTP response
        jinja_template = ui.get_template(
            self, u'project_admin/attachment_upload.html')
        jinja_template_values = dao.get_standard_project_values(project)
        jinja_template_values[u'attachment'] = attachment
        jinja_template_values[u'name'] = self.request.get(u'name')
        jinja_template_values[
            u'attachment_upload_post_url'] = blobstore.create_upload_url(
                u'/project_admin/attachment_upload_post')

        self.response.out.write(jinja_template.render(jinja_template_values))
Ejemplo n.º 24
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        assignment_entity = dao.get_assignment_by_id(
            project, self.request.get(u'assignment_id'))
        error_msg = None if assignment_entity else u'Unable to access specified assignment'

        # Handle delete request
        if assignment_entity and self.request.get(u'delete'):
            try:
                assignment_entity.key.delete()
                dao.touch_project_assignments(project)
                # Delete associated generated interviews
                for interview_entity in dao.get_interviews_by_assignment_name(
                        project, assignment_entity.name):
                    interview_entity.key.delete()
                self.redirect("/project/assignment?project_id={}".format(
                    project.key.id()))
                return
            except Exception as e:
                error_msg = u'Deleting assignment from project failed: {}'.format(
                    e)

        # Handle update request
        if assignment_entity and self.request.get(u'update'):
            try:
                assignment_entity.description = self.request.get(
                    u'description')
                assignment_entity.is_repeating = (
                    self.request.get(u'type') == u'repeating')
                assignment_entity.put()
                dao.touch_project_assignments(project)
                self.redirect("/project/assignment?project_id={}".format(
                    project.key.id()))
                return
            except Exception as e:
                error_msg = u'Updating assignment failed: {}'.format(e)

        # Display the webpage
        self.render(project, assignment_entity, error_msg)
Ejemplo n.º 25
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))

        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        zipfile_string = self.generate_attachments(project)

        # Generate blob file
        blob_file_name = files.blobstore.create(
            mime_type=u'application/octet-stream')
        with files.open(blob_file_name, u'a') as f:
            f.write(zipfile_string)
        files.finalize(blob_file_name)

        # Save blob_key so that it can be deleted later, after document has been downloaded
        if project.attachments_blob_key:
            blobstore.delete(project.attachments_blob_key)
        project.attachments_blob_key = files.blobstore.get_blob_key(
            blob_file_name)
        project.put()

        filename = u'attachments.zip'

        # Set header so that we can write Unicode body; note that headers must be
        # byte strings, not unicode strings
        self.response.content_type = 'charset=utf-8'

        blob_info = blobstore.BlobInfo.get(project.attachments_blob_key)
        if blob_info:
            success = True
            try:
                self.send_blob(project.attachments_blob_key, save_as=filename)
            except:
                success = False

            # Set header again, in case cleared by send_blob
            self.response.content_type = 'charset=utf-8'
            self.response.write(u'Download {}'.format(
                u'successful' if success else u'unsuccessful'))
        else:
            self.response.write(u'Download unsuccessful')
Ejemplo n.º 26
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        name = self.request.get(u'name')
        description = self.request.get(u'description')
        variable_type = self.request.get(u'type')
        input_field = self.request.get(u'input_field')

        if not name:
            error_msg = u'You must specify a name for your variable definition'
        elif not variable_type:
            error_msg = u'You must specify whether this is a single or repeating variable'
        elif not input_field:
            error_msg = u'You must specify which size of input field to display'
        else:
            internal_name = dao.convert_name_to_internal_name(name)
            variable_entity = dao.get_variable_by_internal_name(
                project, internal_name)
            if variable_entity:
                error_msg = u'Adding variable failed, name collision in project: {}'.format(
                    variable_entity.name)
            else:
                try:
                    dao.Variable(name=name,
                                 internal_name=internal_name,
                                 description=description,
                                 is_repeating=(variable_type == u'repeating'),
                                 input_field=input_field,
                                 content=u'',
                                 parent=project.key).put()
                    dao.touch_project_assignments(project)
                    self.redirect("/project/variable?project_id={}".format(
                        project.key.id()))
                    return
                except Exception as e:
                    error_msg = u'Adding variable failed: {}'.format(e)

        # Display the webpage
        self.render(project, error_msg)
Ejemplo n.º 27
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'_project_id'))
        if not dao.test_project_permissions(project, []):
            webapp2.abort(401)

        interview_name = self.request.get(u'_interview_name')

        index = self.request.get(u'_index')

        blobs_info = self.get_uploads(u'upload_file')
        if blobs_info:
            blob_info = blobs_info[0]
            name = self.request.get(u'_variable_name')
            variable_name = u'{}[{}]'.format(name, index) if index else name
            dao.set_variable_blob_key(project, variable_name, blob_info.key())

        query_string_dict = {u'_project_id': project.key.id(),
                             u'_interview_name': interview_name.encode(u'utf-8')}
        if index:
            query_string_dict[u'_index'] = index
        query_string = urllib.urlencode(query_string_dict)
        self.redirect("/project/conduct_interview?{}".format(query_string))
Ejemplo n.º 28
0
    def post(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        variable_entity = dao.get_variable_by_id(
            project, self.request.get(u'variable_id'))
        error_msg = None if variable_entity else u'Unable to access specified variable'

        # Handle delete request
        if variable_entity and self.request.get(u'delete'):
            try:
                variable_entity.key.delete()
                dao.touch_project_assignments(project)
                self.redirect("/project/variable?project_id={}".format(
                    project.key.id()))
                return
            except Exception as e:
                error_msg = u'Deleting variable from project failed: {}'.format(
                    e)

        # Handle update request
        if variable_entity and self.request.get(u'update'):
            try:
                variable_entity.description = self.request.get(u'description')
                variable_entity.is_repeating = (
                    self.request.get(u'type') == u'repeating')
                variable_entity.input_field = self.request.get(u'input_field')
                variable_entity.put()
                dao.touch_project_assignments(project)
                self.redirect("/project/variable?project_id={}".format(
                    project.key.id()))
                return
            except Exception as e:
                error_msg = u'Updating variable failed: {}'.format(e)

        # Display the webpage
        self.render(project, variable_entity, error_msg)
Ejemplo n.º 29
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(
                project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        style_list = list()

        for style_entity in dao.get_styles(project):
            style = dict()
            style[u'id'] = style_entity.key.id()
            style[u'name'] = style_entity.name
            style[u'description'] = style_entity.description
            style[u'css'] = style_entity.css
            style_list.append(style)

        # Create template and template values, render the page
        jinja_template = ui.get_template(self, u'project/style/index.html')

        jinja_template_values = dao.get_standard_project_values(project)
        jinja_template_values[u'styles'] = style_list

        self.response.out.write(jinja_template.render(jinja_template_values))
Ejemplo n.º 30
0
    def get(self):
        project = dao.get_project_by_id(self.request.get(u'project_id'))
        if not dao.test_project_permissions(project, [dao.PROJECT_OWN, dao.PROJECT_MANAGE]):
            webapp2.abort(401)

        document_list = list()

        for document_entity in dao.get_documents(project):
            document = dict()
            document[u'id'] = document_entity.key.id()
            document[u'key'] = document_entity.key
            document[u'name'] = document_entity.name
            document[u'description'] = document_entity.description
            document[u'style'] = document_entity.style_name
            document_list.append(document)

        # Create template and template values, render the page
        jinja_template = ui.get_template(self, u'project/document/index.html')

        jinja_template_values = dao.get_standard_project_values(project)
        jinja_template_values[u'documents'] = document_list

        self.response.out.write(jinja_template.render(jinja_template_values))