summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-api/opendc/models/project.py
blob: f2b3b5644c508b75e0bf64a187ef6d08d9c2f597 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from marshmallow import Schema, fields, validate
from werkzeug.exceptions import Forbidden

from opendc.models.model import Model
from opendc.exts import db


class ProjectAuthorizations(Schema):
    """
    Schema representing a project authorization.
    """
    userId = fields.String(required=True)
    level = fields.String(required=True, validate=validate.OneOf(["VIEW", "EDIT", "OWN"]))


class ProjectSchema(Schema):
    """
    Schema representing a Project.
    """
    _id = fields.String(dump_only=True)
    name = fields.String(required=True)
    datetimeCreated = fields.DateTime()
    datetimeLastEdited = fields.DateTime()
    topologyIds = fields.List(fields.String())
    portfolioIds = fields.List(fields.String())
    authorizations = fields.List(fields.Nested(ProjectAuthorizations))


class Project(Model):
    """Model representing a Project."""

    collection_name = 'projects'

    def check_user_access(self, user_id, edit_access):
        """Raises an error if the user with given [user_id] has insufficient access.

        :param user_id: The User ID of the user.
        :param edit_access: True when edit access should be checked, otherwise view access.
        """
        for authorization in self.obj['authorizations']:
            if user_id == authorization['userId'] and authorization['level'] != 'VIEW' or not edit_access:
                return
        raise Forbidden("Forbidden from retrieving project.")

    @classmethod
    def get_for_user(cls, user_id):
        """Get all projects for the specified user id."""
        return db.fetch_all({'authorizations.userId': user_id}, Project.collection_name)