Ejemplo n.º 1
0
class ProjectIssueMessageModel():
    def __init__(self, conn_tool):
        self._db = conn_tool.db
        self._uid = conn_tool.uid
        self._userModel = UserModel(conn_tool)

    def get_issues(self, pid):
        project = self.__get_project(pid)
        if project == None:
            return {}
        repositories_id = project['repositories']['Github']

        token = self._userModel.get_user_githubToken()
        requester = GithubApiRequester(token)
        issues = []
        for id in repositories_id:
            repo = {}
            rp = requester.get_rp_by_id(id)
            repo['name'] = rp.name
            if rp is not None:
                issue = requester.get_issues(rp)
                repo['issue'] = issue

            issues.append(repo)
        return issues

    def __get_project(self, pid):
        project = self._db.collection(u'projects').document(
            pid).get().to_dict()
        return project
class ProjectWeekCommitModel():
    def __init__(self, conn_tool):
        self._db = conn_tool.db
        self._uid = conn_tool.uid
        self._userModel = UserModel(conn_tool)

    def get_weekcommit(self, pid):
        project = self.__get_project(pid)
        if project == None :
            return {}

        repositories_id = project['repositories']['Github']

        token = self._userModel.get_user_githubToken()
        requester = GithubApiRequester(token)

        repos_commits = []
        for id in repositories_id:
            rp = requester.get_rp_by_id(id)
            if rp is not None:
                repos_commits.append(requester.get_weekcommit(rp))

        all_repo_week_commit = self.__create_repo_week_dict()

        for repo_commits in repos_commits:
            if repo_commits['start_time'] < all_repo_week_commit['start_time']:
                all_repo_week_commit['start_time'] = repo_commits['start_time']
            if repo_commits['end_time'] > all_repo_week_commit['end_time']:
                all_repo_week_commit['end_time'] = repo_commits['end_time']
            for commit_info in repo_commits['commit_info']:
                self.__calculate_commit_times(
                    all_repo_week_commit['commit_info'], commit_info)
        #print(all_repo_week_commit)
        return all_repo_week_commit

    def get_compare_week_commit(self, pid1, pid2):
        commit1 = self.get_weekcommit(pid1)
        if commit1 == {}:
            return {}
        commit1_info = {'pid' : pid1, 'commit' : commit1['commit_info']}
        commit2 = self.get_weekcommit(pid2)
        if commit2 == {}:
            return {}
        commit2_info = {'pid' : pid2, 'commit' : commit2['commit_info']}

        max = lambda m, n: m if m >= n else n
        min = lambda m, n: m if m <= n else n
        new_start_time = max(commit1['start_time'], commit2['start_time'])
        new_end_time = max(commit1['end_time'], commit2['end_time'])
        commit_info_list = [commit1_info, commit2_info]
        compare_repo_week_commit = dict({
            'commit_info' : commit_info_list,
            'start_time' : new_start_time,
            'end_time' : new_end_time
        })
        return compare_repo_week_commit


    def __create_repo_week_dict(self):
        week_dict = {}
        commit_info_list = []
        week_days = ('Monday', 'Tuesday', 'Wednesday',
                     'Thursday', 'Friday', 'Saturday', 'Sunday')
        for week_day in week_days:
            commit_info = {}
            commit_info['week_day'] = week_day
            for hours in range(24):
                commit_info[str(hours).zfill(2)] = 0
            commit_info_list.append(commit_info)

        week_dict['start_time'] = str(datetime.date(2099, 12, 31)).replace('-', '/')
        week_dict['end_time'] = str(datetime.date(1999, 1, 1)).replace('-', '/')
        week_dict['commit_info'] = commit_info_list
        return week_dict

    def __calculate_commit_times(self, week_list: list, commit_info: dict):
        for week_day in week_list:
            if week_day['week_day'] == commit_info['week_day']:
                week_day[commit_info['time']
                         ] = week_day[commit_info['time']] + 1
                break

    def __get_project(self, pid):
        project = self._db.collection(
            u'projects').document(pid).get().to_dict()
        return project
class ProjectModel():
    def __init__(self, conn_tool):
        self._db = conn_tool.db
        self._uid = conn_tool.uid
        self._userModel = UserModel(conn_tool)

    def get_project_list(self):
        proj_owner = self._db.collection('projects').where(
            'owner', '==', self._uid).get()
        proj_collab = self._db.collection('projects').where(
            'collaborator', 'array_contains', self._uid).get()
        proj_list = []
        self.__build_project_list(proj_list, proj_owner)
        self.__build_project_list(proj_list, proj_collab)
        return {'projects': proj_list}, status_code.OK

    def __build_project_list(self, proj_list, projects):
        for project in projects:
            tmpData = project.to_dict()
            tmpData['owner'] = self._userModel.get_user_info_by_uid(
                tmpData['owner'])[0]
            proj_dic = Project.from_dict(tmpData).to_dict()
            proj_dic.update({'id': project.id})
            proj_list.append(proj_dic)

    def get_avail_repos(self, pid):
        token = self._userModel.get_user_githubToken()
        if token != None:
            requester = GithubApiRequester(token)
            existRepos = self._db.collection('projects').document(
                pid).get().to_dict()
            userRepos = requester.get_user_repoList()['repos']
            info = {'repos': []}
            for repo in userRepos:
                if repo['id'] not in existRepos['repositories']['Github']:
                    info['repos'].append(repo)
            return jsonify(info)
        else:
            return {'message': '尚未連結Github'}, status_code.NOT_FOUND

    def get_project_repos(self, pid):
        project, token = self._db.collection('projects').document(
            pid).get().to_dict(), None
        if project['owner'] == self._uid:
            token = self._userModel.get_user_githubToken()
        else:
            token = self._userModel.get_user_githubToken(project['owner'])
        info = {'repos': []}

        if token != None:
            requester = GithubApiRequester(token)
            for repo in requester.get_user_repoList()['repos']:
                if repo['id'] in project['repositories']['Github']:
                    info['repos'].append(repo)
            return info, status_code.OK
        else:
            None, status_code.NOT_FOUND

    def get_project_setting(self, pid):
        project = self._db.collection('projects').document(pid).get()
        if project.exists:
            proj_dic = project.to_dict()
            setting = Setting(proj_dic['name'], proj_dic['collaborator'],
                              self._userModel)
            return setting.to_dict(), status_code.OK
        return None, status_code.NOT_FOUND

    def add_project(self, name):
        if self.__is_project_name_used(name):
            return None, status_code.BAD_REQUEST

        project = Project(name=name,
                          owner=self._uid,
                          updated=firestore.SERVER_TIMESTAMP)
        project_dict = {
            'name': project.name,
            'owner': project.owner,
            'collaborator': project.collaborator,
            'repositories': project.repositories,
            'updated': project.updated
        }

        self._db.collection('projects').document().set(project_dict)
        return None, status_code.OK

    def __is_project_name_used(self, name):
        projects = self._db.collection('projects').where(
            'name', '==', name).where('owner', '==', self._uid).get()
        for project in projects:
            if project.to_dict()['owner'] == self._uid:
                return True
        return False

    def delete_project(self, pid):
        project = self._db.collection('projects').document(pid)
        if project.get().exists and project.get().to_dict(
        )['owner'] == self._uid:
            project.delete()
            return None, status_code.OK
        return None, status_code.NOT_FOUND

    def update_repos(self, pid, data):
        project = self._db.collection('projects').document(pid)

        print(data)

        if project.get().exists:
            if not self.__is_project_owner(project.get().to_dict(), self._uid):
                return None, status_code.OK

            action = data['repositories']['action']
            if action == 'update':
                project.update({
                    'repositories.Github':
                    firestore.ArrayUnion(data['repositories']['Github']),
                    'updated':
                    firestore.SERVER_TIMESTAMP
                })
            elif action == 'remove':
                project.update({
                    'repositories.Github':
                    firestore.ArrayRemove(data['repositories']['Github']),
                    'updated':
                    firestore.SERVER_TIMESTAMP
                })
            else:
                return 'missing action', status_code.BAD_REQUEST
            return None, status_code.OK
        else:
            return None, status_code.NOT_FOUND

    def __is_project_owner(self, project, uid):
        return project['owner'] == uid

    def update_collaborator(self, pid, collaborator, action):
        project = self._db.collection('projects').document(pid)

        if project.get().exists:

            if action == 'add':
                info, code = self._userModel.get_user_info_by_email(
                    collaborator)
                if code == status_code.NOT_FOUND:
                    return info, code
                elif info['uid'] in project.get().to_dict()['collaborator']:
                    info, code = {'msg': '協作者已存在!'}, status_code.BAD_REQUEST
                elif info['uid'] == self._uid:
                    info, code = {'msg': '您已是專案擁有者!'}, status_code.BAD_REQUEST
                else:
                    project.update({
                        'collaborator':
                        firestore.ArrayUnion([info['uid']]),
                        'updated':
                        firestore.SERVER_TIMESTAMP
                    })
                    code = status_code.OK
                return info, code
            elif action == 'remove':
                project.update({
                    'collaborator':
                    firestore.ArrayRemove([collaborator]),
                    'updated':
                    firestore.SERVER_TIMESTAMP
                })
                return {'msg': '移除成功!'}, status_code.OK
            else:
                return {'msg': 'miss action'}, status_code.BAD_REQUEST

        else:
            return {'msg': 'Project Not Found'}, status_code.NOT_FOUND

    def update_name(self, pid, name):
        project = self._db.collection('projects').document(pid)
        if project.get().exists:

            if name != '':
                project.update({
                    'name': name,
                    'updated': firestore.SERVER_TIMESTAMP
                })
                return None, status_code.OK
            else:
                return 'name is require', status_code.BAD_REQUEST

        else:
            return None, status_code.NOT_FOUND