예제 #1
0
    def put(self, id):
        try:
            data = request.get_json()
            TaskService.updateTask(data=data, id=id)
            return {"result": "task updated successfully"}

        except Exception as e:
            return {"error": e.message}
예제 #2
0
    def post(self):
        try:
            data = request.get_json()

            task = TaskService.addTask(data=data)
            return task.serialize
        except KeyError as e:
            return {"error": 'the ' + e.message + ' is required'}
예제 #3
0
    def post(self, project_pk):
        """
        Create a new Project Member

        :param project_pk: Project ID
        :return: the created ProjectMember
        """

        data = request.get_json(silent=True)
        if not data:
            raise api_errors.InvalidAPIUsage(
                api_errors.INVALID_JSON_BODY_MSG
            )

        project = get_project_request(project_pk)

        members_added = []
        errors_list = []
        for member in data:
            if member.get('value'):
                user = User.get_by_id(member.get('value'))
                if not user:
                    errors_list.append(
                        dict(member=api_errors.INVALID_MEMBER_MSG))
            else:
                user = User(email=member.get('text'))
                user.active = False
                user.save()
            if user and project.owner.id != user.id:
                m = ProjectMember.get_by_project_member(project, user)
                if not m:
                    m = ProjectMember(project=project)
                    m.member = user
                    m.save()
                    # Send email notification
                    create_new_member_email(m.member, project)
                    members_added.append(m.to_dict())
                else:
                    errors_list.append(dict(
                        member=api_errors.INVALID_ALREADY_ADDED_MSG
                    ))
        if errors_list:
            raise api_errors.InvalidAPIUsage(
                api_errors.VALIDATION_ERROR_MSG,
                payload=errors_list
            )

        if members_added:
            # save activity
            save_notification(project_pk=project.id,
                              verb='new_members',
                              data={'members': members_added})
        return {}, 200
예제 #4
0
    def post(self, project_pk):
        """
        Update Order
        """
        get_project_request(project_pk)
        data = request.get_json(silent=True)
        if not data:
            raise api_errors.InvalidAPIUsage(api_errors.INVALID_JSON_BODY_MSG)

        Ticket.order_items(data)

        # save activity
        save_notification(project_pk=project_pk,
                          verb='backlog_order',
                          data=data)

        return data, 200
예제 #5
0
    def post(self):
        """
        Create Project
        """
        data = request.get_json(silent=True)
        if not data:
            raise api_errors.InvalidAPIUsage(
                api_errors.INVALID_JSON_BODY_MSG
            )

        prj = Project(name=data.get('name'),
                      owner=g.user.to_dbref())
        prj.active = data.get('active')
        prj.private = data.get('private')
        prj.prefix = data.get('prefix', data.get('name')[:3].upper())
        prj.description = data.get('description')
        prj.project_type = data.get('project_type', 'S')

        # Add initial config
        prj.sprint_duration = 15
        prj.save()

        # add owner as member
        pm = ProjectMember(project=prj)
        pm.member = prj.owner
        pm.is_owner = True
        pm.save()

        # Add 3 columns states
        col_names = ['ToDo', 'In Progress', 'Done']
        for index, c in enumerate(col_names):
            col = Column()
            col.title = c
            col.project = prj
            if index == len(col_names) - 1:
                col.done_column = True
            col.save()

        # save activity
        save_notification(project_pk=prj.pk,
                          verb='new_project',
                          data=prj.to_dict())

        return prj, 201
예제 #6
0
    def post(self, project_pk, tkt_id):
        """
        Create a Comment for a ticket
        :param project_pk: Project ID
        :param tkt_id: Ticket ID
        :return: Created Comment
        """
        get_project_request(project_pk)
        get_ticket_request(tkt_id)
        data = request.get_json(silent=True)
        if not data:
            raise api_errors.InvalidAPIUsage(api_errors.INVALID_JSON_BODY_MSG)

        c = Comment(ticket=tkt_id)
        c.who = current_user.to_dbref()
        c.comment = data.get('comment')
        c.save()

        if data.get('mentions'):
            for m in data.get('mentions'):
                if m is not None:
                    user = User.get_by_id(m)
                    if user:
                        create_notification_email(user, c)
                        # save activity
                        save_notification(project_pk=project_pk,
                                          verb='mention',
                                          user_to=user,
                                          data={
                                              "comment": c.to_dict(),
                                              "ticket": c.ticket.to_dict()
                                          })
        else:
            # save activity
            save_notification(project_pk=project_pk,
                              verb='new_comment',
                              data={
                                  "comment": c.to_dict(),
                                  "ticket": c.ticket.to_dict()
                              })

        return c, 201
예제 #7
0
    def post(self):
        args = parser.parse_args()
        data = request.get_json(force=True)
        username = args.get('email')
        password = args.get('password')
        criterion = [username, password, len(data) == 2]

        if not all(criterion):
            raise JWTError(
                'Bad Request', 'Missing required credentials', status_code=400
            )

        user = _jwt.authentication_callback(username, password)

        if user:
            token = {
                "token": generate_token(user)
            }
            return token
        else:
            raise JWTError('Bad Request', 'Invalid credentials')
예제 #8
0
    def post(self, project_pk):
        """
        Create Ticket
        """
        data = request.get_json(silent=True)

        if not data:
            raise api_errors.InvalidAPIUsage(api_errors.INVALID_JSON_BODY_MSG)

        project = get_project_request(project_pk)

        tkt = Ticket()

        last_tkt = Ticket.get_last_ticket(project_pk)
        tkt.number = last_tkt.number + 1 if last_tkt else 1
        tkt.order = Ticket.get_next_order_index(project_pk)
        tkt.project = project
        tkt.description = data.get('description')
        tkt.points = data.get('points', 0)
        tkt.title = data.get('title')
        tkt.labels = data.get('labels')
        tkt.type = data.get('type', 'U')
        tkt.save()

        if data.get('sprint'):
            # Assign to a sprint
            sprint = Sprint.get_by_id(pk=data.get('sprint')['pk'])
            if sprint:
                spo = SprintTicketOrder(sprint=sprint, ticket=tkt)
                spo.ticket_repr = tkt.to_dict()
                spo.order = SprintTicketOrder.get_next_order_index(sprint.id)
                spo.save()

        # save activity
        save_notification(project_pk=project_pk,
                          verb='new_ticket',
                          data=tkt.to_dict())

        return tkt, 201
예제 #9
0
    def post(self, project_pk):
        """
        Update order of columns

        :param project_pk: project id
        :return: same data sent
        """
        prj = get_project_request(project_pk)

        data = request.get_json(silent=True)
        if not data:
            raise api_errors.InvalidAPIUsage(
                api_errors.INVALID_JSON_BODY_MSG
            )

        Column.order_items(data)

        # save activity
        save_notification(project_pk=prj.id,
                          verb='order_columns',
                          data=data)
        return data, 200
예제 #10
0
    def put(self, project_pk, column_pk):
        """
        Update a column instance

        :param project_pk: Project that belongs
        :param column_pk: Id of the column
        :return: The updated resource
        """

        col = Column.get_by_id(column_pk)
        if not col:
            raise api_errors.MissingResource(
                api_errors.INVALID_COLUMN_MSG
            )

        data = request.get_json(silent=True)

        if not data:
            raise api_errors.InvalidAPIUsage(
                api_errors.INVALID_JSON_BODY_MSG
            )

        col.title = data.get('title')
        col.color_max_cards = data.get('color_max_cards', '#FF0000')
        col.done_column = data.get('done_column', False)
        col.max_cards = data.get('max_cards', 9999)

        # check set other columns of the project to done_column in False
        if col.done_column:
            Column.clear_done_columns(project_pk)
        col.save()

        # save activity
        save_notification(project_pk=project_pk,
                          verb='update_column',
                          data=col.to_dict())

        return col, 200
예제 #11
0
    def post(self, project_pk, sprint_pk):
        """
        Update Order of tickets in sprint

        :param project_pk: Project ID
        :param sprint_pk: Sprint ID
        :return: Order
        """
        get_project_request(project_pk)
        data = request.get_json(silent=True)

        if not data:
            raise api_errors.InvalidAPIUsage(api_errors.INVALID_JSON_BODY_MSG)

        sprint = get_sprint_request(sprint_pk)

        SprintTicketOrder.order_items(data, sprint)
        # save activity
        save_notification(project_pk=project_pk,
                          verb='sprint_ticket_order',
                          data=data)

        return data, 200
예제 #12
0
    def put(self, project_pk):
        """
        Update a Project Instance
        :param project_pk:
        :return:
        """
        project = get_project_request(project_pk)
        data = request.get_json(silent=True)

        if not data:
            raise api_errors.InvalidAPIUsage(
                api_errors.INVALID_JSON_BODY_MSG
            )

        project.active = data.get('active')
        project.description = data.get('description')
        project.name = data.get('name')
        owner = User.get_by_id(data.get('owner_id'))

        if not owner:
            raise api_errors.InvalidAPIUsage(
                api_errors.INVALID_USER_ID_MSG
            )

        project.owner = owner.to_dbref()
        project.private = data.get('private')
        project.sprint_duration = data.get('sprint_duration')
        project.prefix = data.get('prefix')
        project.project_type = data.get('project_type', 'S')
        project.save()

        # save activity
        save_notification(project_pk=project.pk,
                          verb='update_project',
                          data=project.to_dict())

        return project, 200
예제 #13
0
    def post(self, project_pk):
        """
        :param project_pk: Project ID
        :return: Column Resource created
        """
        data = request.get_json(silent=True)
        if not data:
            raise api_errors.InvalidAPIUsage(
                api_errors.INVALID_JSON_BODY_MSG
            )

        project = get_project_request(project_pk)

        col = Column()
        col.order = Column.objects.count()
        col.project = project
        col.title = data.get('title')
        col.color_max_cards = data.get('color_max_cards', '#FF0000')
        col.done_column = data.get('done_column', False)
        col.max_cards = data.get('max_cards', 9999)

        # Check if already exists one Done column
        if col.done_column:
            columns = Column.get_by_project(project)
            for c in columns:
                if c.done_column:
                    c.done_column = False
                    c.save()
        col.save()

        # save activity
        save_notification(project_pk=project.pk,
                          verb='new_column',
                          data=col.to_dict())

        return col, 200
예제 #14
0
 def get_input(self):
     """ Get JSON. The power of having a real object in our hand. """
     return request.get_json(force=True)
예제 #15
0
    def post(self, project_pk):
        """
        Move Ticket to Column or Backlog
        :param project_pk: Project ID
        :return: Ticket Transition
        """
        project = get_project_request(project_pk)

        data = request.get_json(silent=True)
        if not data:
            raise api_errors.InvalidAPIUsage(api_errors.INVALID_JSON_BODY_MSG)

        tkt = get_ticket_request(data.get('ticket'))

        result = {}
        if data.get('backlog'):
            latest_tran = TicketCT.get_latest_transition(tkt)
            if latest_tran:
                latest_tran.latest_state = False
                latest_tran.save()

            SprintTicketOrder.order_items(data.get('order'),
                                          data.get('backlog'))
            # save activity
            save_notification(project_pk=project_pk,
                              verb='ticket_transition',
                              data=data)

            result = latest_tran.to_json(), 200

        else:
            # Search already state
            col = Column.get_by_id(data.get('column'))

            if not col:
                raise api_errors.MissingResource(api_errors.INVALID_COLUMN_MSG)

            user = User.get_by_id(current_user.id)
            if not user:
                raise api_errors.MissingResource(
                    api_errors.INVALID_USER_ID_MSG)

            transition = TicketCT()
            transition.ticket = tkt
            transition.column = col
            transition.order = TicketCT.get_next_order_index(col)

            if project.project_type == 'S':
                sprint = get_sprint_request(data.get('sprint'))
                latest_tran = TicketCT.get_latest_transition(tkt, sprint)

                transition.sprint = sprint
            else:
                latest_tran = TicketCT.get_latest_transition(tkt)

            if latest_tran:
                latest_tran.latest_state = False
                latest_tran.save()

            transition.latest_state = True
            transition.who = user
            transition.save()

            if project.project_type == 'S':
                sprint = get_sprint_request(data.get('sprint'))
                TicketCT.order_items(data.get('order'),
                                     sprint=sprint,
                                     column=col)
            else:
                TicketCT.order_items(data.get('order'), column=col)

            # save activity
            save_notification(project_pk=project_pk,
                              verb='ticket_transition',
                              data=transition.to_dict())

            result = transition.to_json(), 201
        return result
예제 #16
0
 def get_input(self):
     """ Get JSON. The power of having a real object in our hand. """
     return request.get_json(force=True)