Example #1
0
    def create_project(self, data, **kwargs):
        """Create project row in db."""

        # Lock db, get unit row and update counter
        unit_row = (models.Unit.query.filter_by(
            id=auth.current_user().unit_id).with_for_update().one_or_none())
        if not unit_row:
            raise ddserr.AccessDeniedError(
                message="Error: Your user is not associated to a unit.")

        unit_row.counter = unit_row.counter + 1 if unit_row.counter else 1
        data["public_id"] = "{}{:05d}".format(unit_row.internal_ref,
                                              unit_row.counter)

        # Generate bucket name
        data["bucket"] = self.generate_bucketname(
            public_id=data["public_id"], created_time=data["date_created"])

        # Create project
        current_user = auth.current_user()
        new_project = models.Project(
            **{
                **data, "unit_id": current_user.unit.id,
                "created_by": current_user.username
            })
        new_project.project_statuses.append(
            models.ProjectStatuses(**{
                "status": "In Progress",
                "date_created": data["date_created"],
            }))
        generate_project_key_pair(current_user, new_project)

        return new_project
Example #2
0
def fill_basic_db(db):
    """
    Fill the database with basic data.
    """

    units, users, projects = add_data_to_db()
    db.session.add_all(units)
    db.session.add_all(users)

    db.session.commit()

    generate_project_key_pair(users[2], units[0].projects[0])
    generate_project_key_pair(users[2], units[0].projects[2])
    generate_project_key_pair(users[2], units[0].projects[4])

    generate_project_key_pair(users[3], units[0].projects[1])
    generate_project_key_pair(users[3], units[0].projects[3])

    db.session.commit()

    user2_token = encrypted_jwt_token(
        username=users[2].username,
        sensitive_content="password",
    )
    share_project_private_key(
        from_user=users[2],
        to_another=users[0],
        from_user_token=user2_token,
        project=projects[0],
    )
    share_project_private_key(
        from_user=users[2],
        to_another=users[1],
        from_user_token=user2_token,
        project=projects[0],
    )

    user3_token = encrypted_jwt_token(
        username=users[3].username,
        sensitive_content="password",
    )
    share_project_private_key(
        from_user=users[3],
        to_another=users[6],
        from_user_token=user3_token,
        project=projects[3],
    )

    db.session.commit()
Example #3
0
def fill_db():
    """Fills the database with initial entries used for development."""

    # Foreign key/relationship updates:
    # The model with the row db.relationship should append the row of the model with foreign key

    password = "******"

    # Super Admin
    superadmin = models.SuperAdmin(username="******",
                                   password=password,
                                   name="Super Admin")
    superadmin_email = models.Email(email="*****@*****.**",
                                    primary=True)
    superadmin_email.user = superadmin
    db.session.add(superadmin_email)

    # Create first unit user
    unituser_1 = models.UnitUser(
        username="******",
        password=password,
        name="First Unit User",
    )

    # Create second unit user
    unituser_2 = models.UnitUser(
        username="******",
        password=password,
        name="Second Unit User",
    )

    # create a few e-mail addresses
    email_unituser_1 = models.Email(email="*****@*****.**",
                                    primary=True)
    email_unituser_1b = models.Email(email="*****@*****.**",
                                     primary=False)
    email_unituser_2 = models.Email(email="*****@*****.**",
                                    primary=True)
    email_unituser_1.user = unituser_1
    email_unituser_1b.user = unituser_1
    email_unituser_2.user = unituser_2
    unituser_1.active = True
    unituser_2.active = True

    # Create first unit
    unit_1 = models.Unit(
        public_id="unit_1",
        name="Unit 1",
        external_display_name="Unit 1 external",
        contact_email="*****@*****.**",
        internal_ref="someunit",
        safespring_endpoint=current_app.config.get("SAFESPRING_URL"),
        safespring_name=current_app.config.get("DDS_SAFESPRING_PROJECT"),
        safespring_access=current_app.config.get("DDS_SAFESPRING_ACCESS"),
        safespring_secret=current_app.config.get("DDS_SAFESPRING_SECRET"),
    )

    unit_1.users.extend([unituser_1, unituser_2])

    # Create first project - leave out foreign key
    project_1 = models.Project(
        public_id="project_1",
        title="First Project",
        description=
        "This is a test project. You will be able to upload to but NOT download "
        "from this project. Create a new project to test the entire system. ",
        pi="*****@*****.**",
        bucket="testbucket",
    )

    project_1.project_statuses.append(
        models.ProjectStatuses(**{
            "status": "In Progress",
            "date_created": dds_web.utils.current_time()
        }))

    unituser_1.created_projects.append(project_1)

    generate_project_key_pair(unituser_1, project_1)

    # Create second project - leave out foreign key
    project_2 = models.Project(
        public_id="project_2",
        title="Second Project",
        description=
        "This is a test project. You will be able to upload to but NOT download "
        "from this project. Create a new project to test the entire system. ",
        pi="*****@*****.**",
        bucket=
        f"secondproject-{str(dds_web.utils.timestamp(ts_format='%Y%m%d%H%M%S'))}-{str(uuid.uuid4())}",
    )

    project_2.project_statuses.append(
        models.ProjectStatuses(**{
            "status": "In Progress",
            "date_created": dds_web.utils.current_time()
        }))

    unituser_2.created_projects.append(project_2)

    generate_project_key_pair(unituser_2, project_2)

    # Connect project to unit. append (not =) due to many projects per unit
    unit_1.projects.extend([project_1, project_2])

    # Create an email
    email_researchuser_1 = models.Email(email="*****@*****.**",
                                        primary=True)
    # Create first research user
    researchuser_1 = models.ResearchUser(
        username="******",
        password=password,
        name="First Research User",
    )
    email_researchuser_1.user = researchuser_1
    # Create association with user - not owner of project
    project_1_user_1_association = models.ProjectUsers(owner=False)
    # Connect research user to association row. = (not append) due to one user per ass. row
    project_1_user_1_association.researchuser = researchuser_1
    # Connect project to association row. = (not append) due to one project per ass. row
    project_1_user_1_association.project = project_1

    researchuser_1.active = True

    email_researchuser_2 = models.Email(email="*****@*****.**",
                                        primary=True)
    # Create second research user
    researchuser_2 = models.ResearchUser(
        username="******",
        password=password,
        name="Second Research User",
    )
    email_researchuser_2.user = researchuser_2
    # Create association with user - is owner of project
    project_1_user_2_association = models.ProjectUsers(owner=True)
    # Connect research user to association row. = (not append) due to one user per ass. row
    project_1_user_2_association.researchuser = researchuser_2
    # Connect project to association row. = (not append) due to one project per ass. row
    project_1_user_2_association.project = project_1

    researchuser_2.active = True

    # Add unit to database - relationship will add the rest because of foreign key constraints
    db.session.add(unit_1)

    db.session.commit()

    unituser_1_token = encrypted_jwt_token(
        username=unituser_1.username,
        sensitive_content=password,
    )

    share_project_private_key(
        from_user=unituser_1,
        to_another=researchuser_1,
        from_user_token=unituser_1_token,
        project=project_1,
    )

    share_project_private_key(
        from_user=unituser_1,
        to_another=researchuser_2,
        from_user_token=unituser_1_token,
        project=project_1,
    )

    db.session.commit()