Skip to content
This repository was archived by the owner on May 7, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
60b6285
Initial django framework
xtao Feb 7, 2016
e2a5db6
Move gravatar_url to libs
xtao Feb 7, 2016
f996d5a
Migration people to django
xtao Feb 7, 2016
c2eb691
Fix git2 wrong attr
xtao Feb 7, 2016
4d2dc89
Migration gist to django
xtao Feb 8, 2016
6aec585
Migration user to django
xtao Feb 8, 2016
c3f4046
Add user to QuixoteMiddleware
xtao Feb 8, 2016
6cf242d
Fix favicon
xtao Feb 8, 2016
00253a5
Migration mirrors to django
xtao Feb 8, 2016
815bc0f
Remove promo_proj page
xtao Feb 8, 2016
292c842
Migration badge to django
xtao Feb 8, 2016
06ae551
Migration watch & watching to django
xtao Feb 8, 2016
fb6c741
Migration favorites to django
xtao Feb 8, 2016
6af0dfb
Migration fetch to django
xtao Feb 8, 2016
052b9c3
Migration m to django
xtao Feb 8, 2016
2a7ddcf
Migration praise to django
xtao Feb 8, 2016
980db8a
Migration trello to django
xtao Feb 8, 2016
6350474
Migration project watchers & forkers to django
xtao Feb 8, 2016
6cbeeab
Migration project archive to django
xtao Feb 8, 2016
e522b3c
Migration project settings to django
xtao Feb 8, 2016
6d0f312
Migration project source to django
xtao Feb 8, 2016
01a069f
Migration settings to django
xtao Feb 8, 2016
61ae0ca
Migration browsefiles to django
xtao Feb 9, 2016
d936adf
Migration project code_review to django
xtao Feb 9, 2016
5c6aad3
Migration project comments to django
xtao Feb 9, 2016
bcf81c0
Migration project compare to django
xtao Feb 9, 2016
80a7b74
Migration j to django
xtao Feb 15, 2016
20fc204
Migration hub & teams & project issues to django
xtao Feb 16, 2016
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ local_config.py
vilya.log
.vagrant/
code.local.env
db.sqlite3
37 changes: 37 additions & 0 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,47 @@
from gevent import monkey; monkey.patch_all()
from web import app as web
from app_sina import app as git_http
from vilya.wsgi import application as django_app


ROUTE_MAP = [(re.compile(r'/[^/]*\.git.*'), git_http),
(re.compile(r'/[^/]*/([^/]*)\.git.*'), git_http),
(re.compile(r'/admin'), django_app),
(re.compile(r'/people'), django_app),
(re.compile(r'/gist'), django_app),
(re.compile(r'/register'), django_app),
(re.compile(r'/login'), django_app),
(re.compile(r'/logout'), django_app),
(re.compile(r'/mirrors'), django_app),
(re.compile(r'/badge'), django_app),
(re.compile(r'/watch'), django_app),
(re.compile(r'/watching'), django_app),
(re.compile(r'/favorites'), django_app),
(re.compile(r'/m'), django_app),
(re.compile(r'/praise'), django_app),
(re.compile(r'/trello'), django_app),
(re.compile(r'/settings'), django_app),
#(re.compile(r'/\w+/\w+/?$'), django_app),
(re.compile(r'/\w+/\w+/watchers'), django_app),
(re.compile(r'/\w+/\w+/forkers'), django_app),
(re.compile(r'/\w+/\w+/archive'), django_app),
(re.compile(r'/\w+/\w+/settings'), django_app),
(re.compile(r'/\w+/\w+/blob'), django_app),
(re.compile(r'/\w+/\w+/edit'), django_app),
(re.compile(r'/\w+/\w+/tree'), django_app),
(re.compile(r'/\w+/\w+/commits'), django_app),
(re.compile(r'/\w+/\w+/blame'), django_app),
(re.compile(r'/\w+/\w+/raw'), django_app),
(re.compile(r'/\w+/\w+/browsefiles'), django_app),
(re.compile(r'/\w+/\w+/code_review'), django_app),
(re.compile(r'/\w+/\w+/comments'), django_app),
(re.compile(r'/\w+/\w+/compare'), django_app),
(re.compile(r'/\w+/\w+/issues'), django_app),
(re.compile(r'/\w+/\w+/issue_comments'), django_app),
(re.compile(r'/j/'), django_app),
(re.compile(r'/hub/'), django_app),
(re.compile(r'/teams/'), django_app),
(re.compile(r'/vilya'), django_app),
(re.compile(r'/.*'), web)]


Expand Down
1 change: 1 addition & 0 deletions dockerfiles/python/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ docutils==0.12
kombu==3.0.33
billiard==3.3.0.22
paramiko==1.16.0
Django==1.9.2
File renamed without changes.
10 changes: 10 additions & 0 deletions manage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "vilya.settings")

from django.core.management import execute_from_command_line

execute_from_command_line(sys.argv)
2 changes: 1 addition & 1 deletion tests/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from vilya.config import DOMAIN
from vilya.models.project import CodeDoubanProject
from vilya.libs.text import gravatar_url
from vilya.libs.gravatar import gravatar_url
from vilya.libs.permdir import get_repo_root


Expand Down
19 changes: 19 additions & 0 deletions vilya/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from vilya.models.django.user import UserProfile


class UserProfileInline(admin.StackedInline):
model = UserProfile
can_delete = False
verbose_name_plural = 'profile'


class UserAdmin(BaseUserAdmin):
inlines = (UserProfileInline, )


admin.site.unregister(User)
admin.site.register(User, UserAdmin)
7 changes: 7 additions & 0 deletions vilya/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from __future__ import unicode_literals

from django.apps import AppConfig


class VilyaConfig(AppConfig):
name = 'vilya'
12 changes: 9 additions & 3 deletions vilya/libs/emoji.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
':kissing_smiling_eyes:', ':tropical_drink:', ':face_with_medical_mask:',
':pill:', ':ruby:', ':cactus:', ':smiley_stuck_out_tongue_winking_eye:',
':boar:', ':smile:', ':face_with_tear_of_joy:', ':Cancer:',
':couple_in_love:', ':horse:', ':two_men_with_heart:', ':bowtie:',
':couple_in_love:', ':horse:', ':two_men_with_heart:',
':open_mouth:', ':frog_face:', ':Taurus:', ':octopus:', ':ship:',
':shooting_star:', ':face_with_ok_gesture:', ':wolf_face:', ':heart:',
':loudly_crying_face:', ':frowning:', ':scuba_diver:', ':love_hotel:',
Expand All @@ -23,7 +23,7 @@
':tennis_racquet_and_ball:', ':person_frowning:', ':spouting_whale:',
':tangerine:', ':person_bowing_deeply:', ':stuck_out_tongue_closed_eyes:',
':dog_face:', ':circled_ideograph_secret:', ':Libra:', ':jumping_spider:',
':disappointed_face:', ':hamburger:', ':octocat:', ':sleeping:',
':disappointed_face:', ':hamburger:', ':sleeping:',
':crescent_moon:', ':no_one_under_eighteen_symbol:', ':kissing:',
':unamused:', ':couple_with_heart:', ':fisted_hand_sign:',
':smiling_cat_face_with_heart_shaped_eyes:', ':anguished:', ':groupme:',
Expand Down Expand Up @@ -103,7 +103,13 @@
':1f681:', ':1f682:'
]

EMOJI_GROUPS = {}
EMOJI_GROUPS = {
":mergetime:": """
:zap::zap::zap::zap::zap::zap::zap::zap::zap::zap:
:zap::metal: M E R G E T I M E :metal::zap:
:zap::zap::zap::zap::zap::zap::zap::zap::zap::zap:
""",
}


def parse_emoji_groups(text):
Expand Down
6 changes: 3 additions & 3 deletions vilya/libs/git2.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,13 +138,13 @@ def rev_list(self, to_ref, from_ref=None,
to_commit = self.revparse_single(to_ref)
if to_commit.type == GIT_OBJ_TAG:
to_commit = self[to_commit.target]
walker = self.walk(to_commit.id, GIT_SORT_TIME)
walker = self.walk(to_commit.oid, GIT_SORT_TIME)
if from_ref:
try:
from_commit = self.revparse_single(from_ref)
if from_commit.type == GIT_OBJ_TAG:
from_commit = self[from_commit.target]
walker.hide(from_commit.id)
walker.hide(from_commit.oid)
except KeyError:
from_commit = None

Expand Down Expand Up @@ -411,7 +411,7 @@ def ls_tree(self, ref, recursive=None, size=None, name_only=None):

if size:
if objtype == 'blob':
blob = self[entry.id]
blob = self[entry.oid]
item = [mode, objtype, entry.hex, blob.size, path]
else:
item = [mode, objtype, entry.hex, '-', path]
Expand Down
12 changes: 12 additions & 0 deletions vilya/libs/gravatar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
import urllib
import hashlib


def gravatar_url(email, size=80):
# 线上尺寸图已有size: (48, 64, 80)
default = "http://www.gravatar.com/avatar"
url = "http://www.gravatar.com/avatar/" + hashlib.md5(
email.encode('utf8').lower()).hexdigest() + "?"
url += urllib.urlencode({'d': default, 's': str(size), 'r': 'x'})
return url
45 changes: 45 additions & 0 deletions vilya/libs/middleware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-


# TODO(xutao) remove quixote middleware
# FIXME(xutao) remove compatibility for quixote

class QuixoteMiddleware(object):

def process_request(self, request):
from vilya.models.user import User
# FIXME(xutao) remove get_header
if not hasattr(request, 'get_header'):
def get_header(name):
return request.META.get(name)
request.get_header = get_header

if not hasattr(request, 'get_path'):
def get_path(n=0):
path_info = request.environ.get('PATH_INFO', '')
path = request.environ['SCRIPT_NAME'] + path_info
if n == 0:
return path
else:
path_comps = path.split('/')
if abs(n) > len(path_comps)-1:
raise ValueError, "n=%d too big for path '%s'" % (n, path)
if n > 0:
return '/'.join(path_comps[:-n])
elif n < 0:
return '/'.join(path_comps[:-n+1])
else:
assert 0, "Unexpected value for n (%s)" % n
request.get_path = get_path

if not hasattr(request, 'is_mobile'):
from vilya.views.util import is_mobile_device
request.is_mobile = is_mobile_device(request)

if not hasattr(request, 'url'):
request.url = request.get_path()

# translate django user to quixote user
user = request.user
request.django_user = user
request.user = User(user.username)
3 changes: 1 addition & 2 deletions vilya/libs/rdstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,4 @@ def init_store():
return redis.from_url(REDIS_URI)


rdstore = init_store()
rds = rdstore
rds = init_store()
12 changes: 1 addition & 11 deletions vilya/libs/text.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import
import re
import urllib
import hashlib
import docutils
import docutils.core
from vilya.libs.gravatar import gravatar_url # noqa

from mikoto.libs.text import * # noqa
from mikoto.libs.emoji import * # noqa
Expand Down Expand Up @@ -74,15 +73,6 @@ def is_binary(fname):
return False


def gravatar_url(email, size=80):
# 线上尺寸图已有size: (48, 64, 80)
default = "http://www.gravatar.com/avatar"
url = "http://www.gravatar.com/avatar/" + hashlib.md5(
email.encode('utf8').lower()).hexdigest() + "?"
url += urllib.urlencode({'d': default, 's': str(size), 'r': 'x'})
return url


def remove_unknown_character(text):
if isinstance(text, str):
return text.decode('utf-8', 'ignore').encode('utf-8', 'ignore')
Expand Down
Empty file added vilya/migrations/__init__.py
Empty file.
Empty file added vilya/models/django/__init__.py
Empty file.
28 changes: 28 additions & 0 deletions vilya/models/django/project.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-

from django.db import models
from django.contrib.auth.models import User


class Project(models.Model):

# TODO(xutao) name regex
name = models.CharField(max_length=100)
user = models.OneToOneField(User, on_delete=models.CASCADE)
desc = models.CharField(max_length=255)
path = models.CharField(max_length=100)
full_name = models.CharField(max_length=70)
created_at = models.DateTimeField('created at', auto_now_add=True)
updated_at = models.DateTimeField('updated at', auto_now=True)

def __str__(self):
return self.full_name

def __hash__(self):
return hash(self.id)

def __eq__(self, other):
return isinstance(other, Project) and self.id == other.id

def __ne__(self, other):
return not self.__eq__(other)
70 changes: 70 additions & 0 deletions vilya/models/django/user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import User
from vilya.libs.gravatar import gravatar_url
from vilya.models.inbox import Inbox


class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)

# TODO(xutao) gravatar
# TODO(xutao) trello token

# TODO(xutao) team
# TODO(xutao) project
# TODO(xutao) notification
# TODO(xutao) badge
# TODO(xutao) setting

def get_gravatar_url(self, size=80):
return gravatar_url(self.email, size)

@property
def inbox(self):
return Inbox.get(user=self.name)

@property
def unread_notification_count(self):
from vilya.models.notification import Notification
return Notification.unread_count(self.name)


class UserFollower(models.Model):
follower = models.ForeignKey(User, db_constraint=False, related_name='follower')
followee = models.ForeignKey(User, db_constraint=False, related_name='followee')
created_at = models.DateTimeField('created at', auto_now_add=True)
updated_at = models.DateTimeField('updated at', auto_now=True)


class UserEmail(models.Model):
user = models.ForeignKey(User, db_constraint=False)
email = models.CharField(max_length=100)
created_at = models.DateTimeField('created at', auto_now_add=True)
updated_at = models.DateTimeField('updated at', auto_now=True)


class UserKey(models.Model):
title = models.CharField(max_length=128)
text = models.CharField(max_length=1024)
fingerprint = models.CharField(max_length=48)
user = models.ForeignKey(User, db_constraint=False)
created_at = models.DateTimeField('created at', auto_now_add=True)
updated_at = models.DateTimeField('updated at', auto_now=True)


# TODO(xutao) support kind for activity?
class Badge(models.Model):
desc = models.CharField(max_length=1024)
created_at = models.DateTimeField('created at', auto_now_add=True)
updated_at = models.DateTimeField('updated at', auto_now=True)


class UserBadge(models.Model):
user = models.ForeignKey(User, db_constraint=False)
badge = models.ForeignKey(Badge, db_constraint=False)
desc = models.CharField(max_length=1024)
created_at = models.DateTimeField('created at', auto_now_add=True)
updated_at = models.DateTimeField('updated at', auto_now=True)
7 changes: 6 additions & 1 deletion vilya/models/gist.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,12 +108,17 @@ def git_path(self):

@property
def git_url(self):
# TODO(xutao) user namespace
return '%s/%s' % (DOMAIN, self.git_path)

@property
def url(self):
return '%s/gist/%s/%s' % (DOMAIN, self.owner_id, self.id)

@property
def relative_url(self):
return '/gist/%s/%s' % (self.owner_id, self.id)

@property
def download_url(self):
return self.url + '/download'
Expand Down Expand Up @@ -324,7 +329,7 @@ def forks_by_user(cls, owner_id, start=0, limit=10, sort='created',
return [cls(*r) for r in rs]

@classmethod
def stars_by_user(cls, owner_id, start=0, limit=10):
def stars_by_user(cls, owner_id, start=0, limit=10, sort=None, direction=None):
rs = store.execute(
"select gist_id from gist_stars "
"where user_id=%s order by id desc limit %s, %s",
Expand Down
2 changes: 1 addition & 1 deletion vilya/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from quixote import get_user as get_current_user_id, get_session

from vilya.libs.store import store, cache, mc, ONE_MONTH
from vilya.libs.text import gravatar_url
from vilya.libs.gravatar import gravatar_url
from vilya.libs.props import PropsMixin, PropsItem
from vilya.libs.validators import check_email, check_name
from vilya.libs.signals import follow_user_signal
Expand Down
Loading