initial work on adding models for starring repos.
I'm sick of using `git stash`.
This commit is contained in:
parent
f3259c862b
commit
eb956e5b7d
5 changed files with 197 additions and 16 deletions
|
@ -4,7 +4,9 @@ import uuid
|
|||
|
||||
from random import SystemRandom
|
||||
from datetime import datetime
|
||||
from peewee import *
|
||||
from peewee import (Proxy, MySQLDatabase, SqliteDatabase, PostgresqlDatabase, fn, CharField,
|
||||
BooleanField, IntegerField, DateTimeField, ForeignKeyField, TextField,
|
||||
BigIntegerField)
|
||||
from data.read_slave import ReadSlaveModel
|
||||
from sqlalchemy.engine.url import make_url
|
||||
from util.names import urn_generator
|
||||
|
@ -265,6 +267,20 @@ class Repository(BaseModel):
|
|||
super(Repository, self).delete_instance(recursive=False, delete_nullable=False)
|
||||
|
||||
|
||||
class Star(BaseModel):
|
||||
user = ForeignKeyField(User, index=True, related_name="stars")
|
||||
repository = ForeignKeyField(Repository, index=True, related_name="stargazers")
|
||||
created = DateTimeField(default=datetime.now)
|
||||
|
||||
class Meta:
|
||||
database = db
|
||||
read_slaves = (read_slave,)
|
||||
indexes = (
|
||||
# create a unique index on user and repository
|
||||
(('user', 'repository'), True),
|
||||
)
|
||||
|
||||
|
||||
class Role(BaseModel):
|
||||
name = CharField(index=True, unique=True)
|
||||
|
||||
|
@ -550,4 +566,4 @@ all_models = [User, Repository, Image, AccessToken, Role, RepositoryPermission,
|
|||
Notification, ImageStorageLocation, ImageStoragePlacement,
|
||||
ExternalNotificationEvent, ExternalNotificationMethod, RepositoryNotification,
|
||||
RepositoryAuthorizedEmail, ImageStorageTransformation, DerivedImageStorage,
|
||||
TeamMemberInvite]
|
||||
TeamMemberInvite, Star]
|
||||
|
|
42
data/migrations/versions/3b668be15dc0_add_stars.py
Normal file
42
data/migrations/versions/3b668be15dc0_add_stars.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
"""add stars
|
||||
|
||||
Revision ID: 3b668be15dc0
|
||||
Revises: 204abf14783d
|
||||
Create Date: 2014-11-14 14:11:18.687340
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '3b668be15dc0'
|
||||
down_revision = '204abf14783d'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects import mysql
|
||||
|
||||
def upgrade(tables):
|
||||
### commands auto generated by Alembic - please adjust! ###
|
||||
op.create_table('star',
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('user_id', sa.Integer(), nullable=False),
|
||||
sa.Column('repository_id', sa.Integer(), nullable=False),
|
||||
sa.Column('created', sa.DateTime(), nullable=False),
|
||||
sa.ForeignKeyConstraint(['repository_id'], ['repository.id'], name=op.f('fk_star_repository_id_repository')),
|
||||
sa.ForeignKeyConstraint(['user_id'], ['user.id'], name=op.f('fk_star_user_id_user')),
|
||||
sa.PrimaryKeyConstraint('id', name=op.f('pk_star'))
|
||||
)
|
||||
op.create_index('star_repository_id', 'star', ['repository_id'], unique=False)
|
||||
op.create_index('star_user_id', 'star', ['user_id'], unique=False)
|
||||
op.create_index('star_user_id_repository_id', 'star', ['user_id', 'repository_id'], unique=True)
|
||||
### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade(tables):
|
||||
### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_constraint('fk_star_repository_id_repository', 'star', type_='foreignkey')
|
||||
op.drop_constraint('fk_star_user_id_user', 'star', type_='foreignkey')
|
||||
op.drop_index('star_user_id_repository_id', table_name='star')
|
||||
op.drop_index('star_user_id', table_name='star')
|
||||
op.drop_index('star_repository_id', table_name='star')
|
||||
op.drop_table('star')
|
||||
### end Alembic commands ###
|
|
@ -2385,3 +2385,54 @@ def archivable_buildlogs_query():
|
|||
.where((RepositoryBuild.phase == BUILD_PHASE.COMPLETE) |
|
||||
(RepositoryBuild.phase == BUILD_PHASE.ERROR) |
|
||||
(RepositoryBuild.started < presumed_dead_date), RepositoryBuild.logs_archived == False))
|
||||
|
||||
|
||||
def star_repository(user, repository):
|
||||
""" Stars a repository. """
|
||||
star = Star.create(user=user.id, repository=repository.id)
|
||||
star.save()
|
||||
|
||||
|
||||
def unstar_repository(user, repository):
|
||||
""" Unstars a repository. """
|
||||
try:
|
||||
star = (Star
|
||||
.select()
|
||||
.join(Repository)
|
||||
.switch(Star)
|
||||
.join(User)
|
||||
.where(Repository.id == repository.id, User.id == user.id)
|
||||
.get())
|
||||
except Star.DoesNotExist:
|
||||
raise DataModelException('Star not found.')
|
||||
|
||||
star.delete_instance()
|
||||
|
||||
|
||||
def get_user_starred_repositories(user, limit=None, page=None):
|
||||
""" Retrieves all of the repositories a user has starred. """
|
||||
query = (Repository
|
||||
.select()
|
||||
.join(Star)
|
||||
.join(User)
|
||||
.where(User.id == user.id)
|
||||
.order_by(Star.created))
|
||||
|
||||
if page and limit:
|
||||
query = query.paginate(page, limit)
|
||||
elif limit:
|
||||
query = query.limit(limit)
|
||||
|
||||
return query
|
||||
|
||||
|
||||
def repository_is_starred(user, repository):
|
||||
""" Determines whether a user has starred a repository or not. """
|
||||
try:
|
||||
(Star
|
||||
.select()
|
||||
.where(Star.repository == repository.id, Star.user == user.id)
|
||||
.get())
|
||||
return True
|
||||
except Star.DoesNotExist:
|
||||
return False
|
||||
|
|
Reference in a new issue