initial work on adding models for starring repos.

I'm sick of using `git stash`.
This commit is contained in:
Jimmy Zelinskie 2014-11-19 14:50:56 -05:00
parent f3259c862b
commit eb956e5b7d
5 changed files with 197 additions and 16 deletions

View file

@ -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]

View 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 ###

View file

@ -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