Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

from flask import Flask
app = Flask(__name__)
# Disable sorting of the jsonified data
app.config['JSON_SORT_KEYS'] = False

from api.models import db
import api.models
Expand Down
44 changes: 42 additions & 2 deletions src/api/controllers/projectController.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from api.models import db, Project
from api.models import db, Project, UserHasProject, ProjectLink

class ProjectController:
session = db.session()
Expand All @@ -7,8 +7,48 @@ def create_project(self, **kwargs):
self.session.add(project)
self.session.commit()

return project

def update_project(self, id, **kwargs):
project = Project.query.filter_by(id=id).first()

if project == None:
return project

for key, value in kwargs.items():
setattr(project, key, value)

db.session.commit()

return project

def get_project(self, **kwargs):
project = Project.query.filter_by(**kwargs).first()

return project

def get_all_projects(self, **kwargs):
all_projects = Project.query.all()

return all_projects

def delete_project(self, id):
# Remove all project's links
for link in ProjectLink.query.filter_by(project_id=id).all():
db.session.delete(link)

# Remove project from all users
for project in UserHasProject.query.filter_by(project_id=id).all():
db.session.delete(project)

project = Project.query.filter_by(id=id).first()

if project == None:
return project

db.session.delete(project)
db.session.commit()

return project

projectController = ProjectController()
projectController = ProjectController()
42 changes: 41 additions & 1 deletion src/api/controllers/userController.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from api.models import db, User
from api.models import db, User, UserHasProject, UserLink

class UserController:
session = db.session()
Expand All @@ -7,8 +7,48 @@ def create_user(self, **kwargs):
self.session.add(user)
self.session.commit()

return user

def update_user(self, id, **kwargs):
user = User.query.filter_by(id=id).first()

if user == None:
return user

for key, value in kwargs.items():
setattr(user, key, value)

db.session.commit()

return user

def get_user(self, **kwargs):
user = User.query.filter_by(**kwargs).first()

return user

def get_all_users(self, **kwargs):
all_users = User.query.all()

return all_users

def delete_user(self, id):
# Remove all user's links
for link in UserLink.query.filter_by(user_id=id).all():
db.session.delete(link)

# Remove user from all projects
for project in UserHasProject.query.filter_by(user_id=id).all():
db.session.delete(project)

user = User.query.filter_by(id=id).first()

if user == None:
return user

db.session.delete(user)
db.session.commit()

return user

userController = UserController()
26 changes: 23 additions & 3 deletions src/api/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,16 @@
"""
from sys import argv
from datetime import datetime

from api.models.database import db, init_db
from api.models.userModel import UserHasProject, User, UserLink
from api.models.projectModel import Project, ProjectLink

from api.models.userModel import User
from api.models.userLinkModel import UserLink
from api.models.projectModel import Project
from api.models.projectLinkModel import ProjectLink
from api.models.userHasProjectModel import UserHasProject
from api.models.userFeedbackModel import UserFeedback
from api.models.projectFeedbackModel import ProjectFeedback

if '--reset-db' in argv:
init_db(True)
Expand All @@ -17,10 +24,12 @@
import datetime;

user1 = User(name='Foe Joe')
user2 = User(name='Tommy Frich')
user3 = User(name='Limm Carter')
link1 = UserLink(name='GitHub', url='https://github.com')
user1.links.append(link1)

project1 = Project(name='Hello, World!', description='First project.', development_status=2, creation_date=datetime.datetime.now())
project1 = Project(name='Hello, World!', repository="https://github.com/ProgrammingBuddies/programmingbuddies-api", description='First project.', development_status=2, creation_date=datetime.datetime.now())
link2 = ProjectLink(name='Reddit', url='https://reddit.com')
project1.links.append(link2)

Expand All @@ -29,6 +38,17 @@

user1.projects.append(userHasProject)

feedback1 = ProjectFeedback(rating=3, description="Cool project!", project_feed_author=user1, project=project1)
feedback2 = ProjectFeedback(rating=1, description="Not so cool!", project_feed_author=user2, project=project1)

# project1.feedbacks.append(feedback1)
# project1.feedbacks.append(feedback2)

feedback3 = UserFeedback(user_feed_author=user1, destination=user2, rating=5, description="Good guy!")
feedback4 = UserFeedback(user_feed_author=user3, destination=user2, rating=1, description="Poor guy!")

db.session.add(user1)
db.session.add(user2)
db.session.add(user3)
db.session.commit()
"""
8 changes: 8 additions & 0 deletions src/api/models/projectFeedbackModel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from api.models import db

class ProjectFeedback(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
project_id = db.Column(db.Integer, db.ForeignKey('project.id'))
rating = db.Column(db.Integer, nullable=False)
description = db.Column(db.String(255), nullable=True)
20 changes: 20 additions & 0 deletions src/api/models/projectLinkModel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from api.models import db

class ProjectLink(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
url = db.Column(db.Text, nullable=False)
project_id = db.Column(db.Integer, db.ForeignKey('project.id'), nullable=False)

# todo: decide if this should contain project_id (it is already present in the model)
def as_dict(self):
obj_d = {
'id': self.id,
'name': self.name,
'url': self.url,
'project_id': self.project_id
}
return obj_d

def __repr__(self):
return '<ProjectLink %r>' % self.name
33 changes: 22 additions & 11 deletions src/api/models/projectModel.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,35 @@
from api.models import db
from datetime import datetime

from api.models.userHasProjectModel import UserHasProject
from api.models.projectLinkModel import ProjectLink

class Project(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
description = db.Column(db.Text, nullable=False)
languages = db.Column(db.Text)
development_status = db.Column(db.Integer, nullable=False)
creation_date = db.Column(db.DateTime, nullable=False)
development_status = db.Column(db.Integer, nullable=False, default=0)
creation_date = db.Column(db.DateTime, nullable=False, default=datetime.now())
release_date = db.Column(db.DateTime)
repository = db.Column(db.Text, nullable=False)
users = db.relationship('UserHasProject', back_populates='project')
links = db.relationship('ProjectLink', backref='project', lazy=True)
feedbacks = db.relationship('ProjectFeedback', backref='project')

def __repr__(self):
return '<Project %r>' % self.name

class ProjectLink(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
url = db.Column(db.Text, nullable=False)
project_id = db.Column(db.Integer, db.ForeignKey('project.id'), nullable=False)
def as_dict(self):
obj_d = {
'id': self.id,
'name': self.name,
'description': self.description,
'languages': self.languages,
'development_status': self.development_status,
'creation_date': self.creation_date,
'release_date': self.release_date,
'users': [ user.user_as_dict() for user in self.users ],
'links': [ link.as_dict() for link in self.links ]
}
return obj_d

def __repr__(self):
return '<ProjectLink %r>' % self.name
return '<Project %r>' % self.name
18 changes: 18 additions & 0 deletions src/api/models/userFeedbackModel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from api.models import db

class UserFeedback(db.Model):
id = db.Column(db.Integer, primary_key=True)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
rating = db.Column(db.Integer, nullable=False)
description = db.Column(db.String(255), nullable=True)

def as_dict(self):
obj_d = {
'id': self.id,
'author': self.author_id,
'user': self.user_id,
'rating': self.rating,
'description': self.description,
}
return obj_d
14 changes: 14 additions & 0 deletions src/api/models/userHasProjectModel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from api.models import db

class UserHasProject(db.Model):
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
project_id = db.Column(db.Integer, db.ForeignKey('project.id'), primary_key=True)
user = db.relationship('User', back_populates='projects')
project = db.relationship('Project', back_populates='users')
role = db.Column(db.Integer, nullable=False)

def user_as_dict(self):
return { 'user_id': self.user_id, 'role': self.role }

def project_as_dict(self):
return { 'project_id': self.project_id, 'role': self.role }
19 changes: 19 additions & 0 deletions src/api/models/userLinkModel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from api.models import db

class UserLink(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
url = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

def as_dict(self):
obj_d = {
'id': self.id,
'name': self.name,
'url': self.url,
'user_id': self.user_id
}
return obj_d

def __repr__(self):
return '<UserLink %r>' % self.name
35 changes: 20 additions & 15 deletions src/api/models/userModel.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
from api.models import db

class UserHasProject(db.Model):
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
project_id = db.Column(db.Integer, db.ForeignKey('project.id'), primary_key=True)
user = db.relationship('User', back_populates='projects')
project = db.relationship('Project', back_populates='users')
role = db.Column(db.Integer, nullable=False)
from api.models.userHasProjectModel import UserHasProject
from api.models.userLinkModel import UserLink
from api.models.projectFeedbackModel import ProjectFeedback

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
Expand All @@ -17,15 +14,23 @@ class User(db.Model):
occupation = db.Column(db.String(80))
projects = db.relationship('UserHasProject', back_populates='user')
links = db.relationship('UserLink', backref='user', lazy=True)
project_feedbacks = db.relationship('ProjectFeedback', backref='project_feed_author')
user_feedbacks = db.relationship('UserFeedback', foreign_keys="UserFeedback.author_id", backref='user_feed_author')
received_feebacks = db.relationship('UserFeedback', foreign_keys="UserFeedback.user_id", backref='destination')

def __repr__(self):
return '<User %r>' % self.name

class UserLink(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
url = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
def as_dict(self):
obj_d = {
'id': self.id,
'name': self.name,
'bio': self.bio,
'languages': self.languages,
'interests': self.interests,
'location': self.location,
'occupation': self.occupation,
'projects': [ project.project_as_dict() for project in self.projects ],
'links': [ link.as_dict() for link in self.links ]
}
return obj_d

def __repr__(self):
return '<UserLink %r>' % self.name
return '<User %r>' % self.name
2 changes: 1 addition & 1 deletion src/api/views/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""
The views package
"""
from api.views import userView, oauthView
from api.views import userView, projectView, oauthView
Loading