├── main
├── api
│ ├── __init__.py
│ ├── v1
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── auth.py
│ │ ├── repo.py
│ │ ├── account.py
│ │ └── user.py
│ ├── fields.py
│ └── helpers.py
├── static
│ ├── img
│ │ └── favicon.ico
│ ├── src
│ │ ├── script
│ │ │ ├── site
│ │ │ │ ├── admin.coffee
│ │ │ │ ├── gh.coffee
│ │ │ │ ├── app.coffee
│ │ │ │ ├── auth.coffee
│ │ │ │ └── user.coffee
│ │ │ └── common
│ │ │ │ ├── api.coffee
│ │ │ │ └── util.coffee
│ │ └── style
│ │ │ ├── variables.less
│ │ │ ├── user.less
│ │ │ ├── mixins.less
│ │ │ ├── style.less
│ │ │ ├── footer.less
│ │ │ ├── base.less
│ │ │ ├── gh.less
│ │ │ ├── test.less
│ │ │ └── signin.less
│ └── robots.txt
├── queue.yaml
├── model
│ ├── __init__.py
│ ├── repo.py
│ ├── base.py
│ ├── account.py
│ ├── user.py
│ ├── config.py
│ └── config_auth.py
├── templates
│ ├── admin
│ │ ├── test
│ │ │ ├── test_one.html
│ │ │ ├── test_badge.html
│ │ │ ├── test_label.html
│ │ │ ├── test_pagination.html
│ │ │ ├── test_button.html
│ │ │ ├── test_heading.html
│ │ │ ├── test_social.html
│ │ │ ├── test_font.html
│ │ │ ├── test_filter.html
│ │ │ ├── test_paragraph.html
│ │ │ ├── test.html
│ │ │ ├── test_responsive.html
│ │ │ ├── test_alert.html
│ │ │ ├── test_grid.html
│ │ │ ├── test_table.html
│ │ │ └── test_form.html
│ │ ├── bit
│ │ │ ├── github.html
│ │ │ ├── yahoo_oauth.html
│ │ │ ├── google_analytics_tracking_id.html
│ │ │ ├── vk_oauth.html
│ │ │ ├── bitbucket_oauth.html
│ │ │ ├── recaptcha.html
│ │ │ ├── letsencrypt.html
│ │ │ ├── reddit_oauth.html
│ │ │ ├── facebook_oauth.html
│ │ │ ├── twitter_oauth.html
│ │ │ ├── dropbox_oauth.html
│ │ │ ├── github_oauth.html
│ │ │ ├── linkedin_oauth.html
│ │ │ ├── instagram_oauth.html
│ │ │ ├── microsoft_oauth.html
│ │ │ ├── security.html
│ │ │ └── google_oauth.html
│ │ ├── admin_base.html
│ │ ├── admin_auth.html
│ │ ├── admin_config.html
│ │ └── admin.html
│ ├── bit
│ │ ├── contact_menu.html
│ │ ├── style.html
│ │ ├── meta.html
│ │ ├── notifications.html
│ │ ├── announcement.html
│ │ ├── script.html
│ │ ├── limit_bar.html
│ │ ├── analytics.html
│ │ ├── footer.html
│ │ ├── user_menu.html
│ │ └── header.html
│ ├── account
│ │ ├── list_repo.html
│ │ ├── list_person.html
│ │ ├── list_organization.html
│ │ ├── list_organization_bit.html
│ │ ├── item_account_bit.html
│ │ ├── list_person_bit.html
│ │ ├── list_new.html
│ │ ├── list_repo_bit.html
│ │ ├── admin_account_list.html
│ │ └── view.html
│ ├── error.html
│ ├── profile
│ │ ├── profile_update.html
│ │ ├── profile_password.html
│ │ ├── profile.html
│ │ └── profile_base.html
│ ├── auth
│ │ ├── signup_form.html
│ │ ├── signin_form.html
│ │ └── auth.html
│ ├── user
│ │ ├── user_email_field.html
│ │ ├── user_activate.html
│ │ ├── user_forgot.html
│ │ ├── user_reset.html
│ │ ├── user_update.html
│ │ └── user_merge.html
│ ├── base.html
│ ├── error_static.html
│ ├── feedback.html
│ ├── welcome.html
│ ├── sitemap.xml
│ ├── repo
│ │ └── admin_repo_list.html
│ └── macro
│ │ ├── utils.html
│ │ └── forms.html
├── __init__.py
├── control
│ ├── __init__.py
│ ├── letsencrypt.py
│ ├── repo.py
│ ├── error.py
│ ├── feedback.py
│ ├── test.py
│ ├── account.py
│ ├── gh.py
│ ├── profile.py
│ └── welcome.py
├── auth
│ ├── __init__.py
│ ├── gae.py
│ ├── dropbox.py
│ ├── twitter.py
│ ├── vk.py
│ ├── facebook.py
│ ├── instagram.py
│ ├── github.py
│ ├── bitbucket.py
│ ├── microsoft.py
│ ├── linkedin.py
│ ├── google.py
│ ├── yahoo.py
│ └── reddit.py
├── appengine_config.py
├── cron.yaml
├── main.py
├── cache.py
├── app.yaml
└── config.py
├── .bowerrc
├── gulpfile.js
├── gulp
├── util.coffee
├── config.coffee
├── tasks
│ ├── ext.coffee
│ ├── script.coffee
│ ├── style.coffee
│ ├── watch.coffee
│ ├── clean.coffee
│ ├── dep.coffee
│ └── build.coffee
└── paths.coffee
├── requirements.txt
├── .editorconfig
├── .gitignore
├── .hgignore
├── gulpfile.coffee
├── bower.json
├── package.json
├── LICENSE
└── README.md
/main/api/__init__.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 |
--------------------------------------------------------------------------------
/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "bower_components"
3 | }
4 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | require('coffee-script/register');
2 | require('./gulpfile.coffee');
3 |
--------------------------------------------------------------------------------
/main/static/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chubin/github-stats/HEAD/main/static/img/favicon.ico
--------------------------------------------------------------------------------
/main/queue.yaml:
--------------------------------------------------------------------------------
1 | queue:
2 | - name: default
3 | rate: 30/s
4 | bucket_size: 60
5 | max_concurrent_requests: 20
6 |
--------------------------------------------------------------------------------
/main/static/src/script/site/admin.coffee:
--------------------------------------------------------------------------------
1 | window.init_admin_config = ->
2 | # do something with the admin page here
3 |
--------------------------------------------------------------------------------
/main/static/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow: /signout/
3 | Disallow: /signin/*/
4 | Disallow: /api/
5 | Disallow: /_ah/
6 |
--------------------------------------------------------------------------------
/main/api/v1/__init__.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 |
3 | from .auth import *
4 | from .config import *
5 | from .user import *
6 | from .account import *
7 | from .repo import *
8 |
--------------------------------------------------------------------------------
/main/static/src/script/site/gh.coffee:
--------------------------------------------------------------------------------
1 | window.init_gh_view = ->
2 | if $('#status').data('status') is 'syncing'
3 | setTimeout ->
4 | location.reload()
5 | , 8000
6 |
--------------------------------------------------------------------------------
/gulp/util.coffee:
--------------------------------------------------------------------------------
1 | $ = do require 'gulp-load-plugins'
2 |
3 | onError = (err) ->
4 | do $.util.beep
5 | console.log err
6 | this.emit 'end'
7 |
8 | module.exports = {onError}
9 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | blinker==1.4
2 | flask-login==0.3.2
3 | flask-oauthlib==0.9.2
4 | flask-restful==0.3.5
5 | flask-wtf==0.12
6 | flask==0.10.1
7 | pygithub==1.26.0
8 | unidecode==0.4.19
9 | webargs==1.2.0
10 |
--------------------------------------------------------------------------------
/main/model/__init__.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 |
3 | from .base import Base
4 | from .config_auth import ConfigAuth
5 | from .config import Config
6 | from .user import User
7 | from .account import Account
8 | from .repo import Repo
9 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # editorconfig.org
2 |
3 | root = true
4 |
5 | [*]
6 | charset = utf-8
7 | end_of_line = lf
8 | indent_size = 2
9 | indent_style = space
10 | insert_final_newline = true
11 | trim_trailing_whitespace = true
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 |
3 | *.pyc
4 | *.pyo
5 | .DS_Store
6 | .git*
7 | .hg*
8 | bower_components
9 | main/index.yaml
10 | main/lib
11 | main/lib.zip
12 | main/static/dev
13 | main/static/ext
14 | main/static/min
15 | node_modules
16 | temp/
17 |
--------------------------------------------------------------------------------
/main/templates/admin/test/test_one.html:
--------------------------------------------------------------------------------
1 | # extends 'admin/admin_base.html'
2 |
3 |
4 | # block admin_content
5 |
Maybe it's our fault.. maybe it's yours.. but either case, this page is unavailable!
11 |
17 | # endblock
18 |
--------------------------------------------------------------------------------
/main/templates/bit/limit_bar.html:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/main/templates/bit/analytics.html:
--------------------------------------------------------------------------------
1 | # if not current_user.admin and config.CONFIG_DB.analytics_id
2 |
10 | # endif
11 |
--------------------------------------------------------------------------------
/main/static/src/style/footer.less:
--------------------------------------------------------------------------------
1 | html {
2 | position: relative;
3 | min-height: 100%;
4 | }
5 |
6 | body {
7 | margin-bottom: @footer-height;
8 | }
9 |
10 | .footer {
11 | position: absolute;
12 | bottom: 0;
13 | display: table;
14 | width: 100%;
15 | height: @footer-height;
16 | border-top: 1px solid @hr-border;
17 | color: @text-muted;
18 | background-color: @well-bg;
19 | text-align: center;
20 | & > .container {
21 | display: table-cell;
22 | vertical-align: middle;
23 | p:last-child {
24 | margin-bottom: 0;
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/main/templates/admin/bit/google_oauth.html:
--------------------------------------------------------------------------------
1 | {{
2 | forms.panel_fields(
3 | 'Google',
4 | (form.google_client_id, form.google_client_secret),
5 | '''
6 | Redirect URI for Google application:
7 | %sh1. {{config.CONFIG_DB.brand_name}} Heading |
5 |
h2. {{config.CONFIG_DB.brand_name}} Heading |
8 |
h3. {{config.CONFIG_DB.brand_name}} Heading |
11 |
h4. {{config.CONFIG_DB.brand_name}} Heading |
14 |
h5. {{config.CONFIG_DB.brand_name}} Heading |
17 |
h6. {{config.CONFIG_DB.brand_name}} Heading |
20 |
| Weight | 11 |Normal | 12 |Italic | 13 |
|---|---|---|
| {{weight}} | 20 |
21 | {{lorem}} 22 | |
23 |
24 | {{lorem}} 25 | |
26 |
Please check back in a bit.
30 |
8 | This app was made with
| Rank | 6 |Name | 7 |8 | # if 'star' in order 9 | Stars 10 | # else 11 | Stars 12 | # endif 13 | | 14 | 21 | 22 |
|---|
2 | Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor 3 | auctor. Duis mollis, est non commodo luctus. 4 |
5 |
6 | Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis
7 | natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
8 | Nullam id dolor id nibh ultricies vehicula.
9 |
11 | Cum sociis natoque penatibus et magnis dis parturient 12 | montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor 13 | fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, 14 | eget lacinia odio sem nec elit. Donec ullamcorper nulla non 15 | metus auctor fringilla. 16 |
17 |18 | Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id 19 | elit non mi porta gravida at eget metus. Duis mollis, est non commodo 20 | luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. 21 |
22 | -------------------------------------------------------------------------------- /main/templates/welcome.html: -------------------------------------------------------------------------------- 1 | # extends 'base.html' 2 | # import 'macro/utils.html' as utils 3 | 4 | # block content 5 |13 | # set instances_url = 'https://console.developers.google.com/project/%s/appengine/instances?moduleId=default&versionId=%s' % ( 14 | config.APPLICATION_ID, 15 | config.CURRENT_VERSION_NAME, 16 | ) if config.PRODUCTION else '' 17 | 18 | For most of the settings to be applied for everyone, you will 19 | # if instances_url 20 | have to restart 21 | # else 22 | have to restart 23 | # endif 24 | the instances. 25 |
26 | # endif 27 | # block admin_header 28 | # endblock 29 || Rank | 6 |Name | 7 |8 | # if 'star' in order 9 | Stars 10 | # else 11 | Stars 12 | # endif 13 | | 14 | 21 | 28 | 29 |
|---|
| {{index}}. | 14 |
15 | |
18 | {{account_db.stars_hu}} | 19 |20 | 23 | | 24 |
| # | 5 |Column heading | 6 |Column heading | 7 |Column heading | 8 |
|---|---|---|---|
| 1 | 13 |Column content | 14 |Column content | 15 |Column content | 16 |
| 2 | 19 |Column content | 20 |Column content | 21 |Column content | 22 |
| 3 | 25 |Column content | 26 |Column content | 27 |Column content | 28 |
| 4 | 31 |Column content | 32 |Column content | 33 |Column content | 34 |
| 5 | 37 |Column content | 38 |Column content | 39 |Column content | 40 |
| 6 | 43 |Column content | 44 |Column content | 45 |Column content | 46 |
| 7 | 49 |Column content | 50 |Column content | 51 |Column content | 52 |
| 8 | 55 |Column content | 56 |Column content | 57 |Column content | 58 |
| 9 | 61 |Column content | 62 |Column content | 63 |Column content | 64 |
40 | Change on Gravatar 41 |
42 | # endif 43 || Rank | 8 |Name | 9 |10 | # if 'star' in order 11 | Stars 12 | # else 13 | Stars 14 | # endif 15 | | 16 | 23 | 24 |
|---|---|---|
| {{loop.index}}. | 31 |
32 | |
35 | {{repo_db.stars_hu}} | 36 | # if order 37 | 38 | 39 | # endif 40 |
| {{utils.order_by_link('name', 'Name')}} | 14 |{{utils.order_by_link('description', 'Description')}} | 15 |{{utils.order_by_link('stars', 'Stars')}} | 16 |{{utils.order_by_link('forks', 'Forks')}} | 17 |{{utils.order_by_link('fork', 'Fork')}} | 18 |{{utils.order_by_link('language', 'Language')}} | 19 |{{utils.order_by_link('modified', 'Modified')}} {{utils.order_by_link('created', 'Created')}} |
20 |
|---|---|---|---|---|---|---|
| {{repo_db.name}} {{repo_db.account_username}} |
26 | {{repo_db.description}} | 27 |{{repo_db.stars_hu}} | 28 |{{repo_db.forks_hu}} | 29 |{{repo_db.fork}} | 30 |{{repo_db.language}} | 31 |
32 | 35 | 38 | |
39 |
| {{utils.order_by_link('name', 'Name')}} {{utils.order_by_link('username', 'Username')}} |
14 | {{utils.order_by_link('stars', 'Stars')}} | 15 |{{utils.order_by_link('public_repos', 'Repos')}} | 16 |{{utils.order_by_link('followers', 'Followers')}} | 17 |{{utils.order_by_link('status', 'Status')}} | 18 |{{utils.order_by_link('modified', 'Modified')}} {{utils.order_by_link('created', 'Created')}} |
19 |
|---|---|---|---|---|---|
| {{account_db.name}} {{account_db.username}} |
25 | {{account_db.stars_hu}} | 26 |{{account_db.public_repos_hu}} | 27 |{{account_db.followers_hu if not account_db.organization else '-'}} | 28 |{{account_db.status}} | 29 |
30 | 33 | 36 | |
37 |
10 |
11 |
| 45 | {{account_db.public_repos_hu}} Repositories 46 | | 47 ||||
|---|---|---|---|
| 53 | 54 | {{repo_db.name}} 55 | | 56 |{{repo_db.stars_hu}} | 57 | 58 | 59 |||
| Name | 20 |Username | 21 |Created | 23 |Permissions | 24 |25 | | |
|---|---|---|---|---|---|
|
31 |
32 | |
38 | {{user_db.username}} | 39 |{{user_db.email}} | 40 |41 | 44 | | 45 |46 | # if user_db.admin 47 | admin 48 | # endif 49 | # if not user_db.active 50 | inactive 51 | # endif 52 | # for permission in user_db.permissions 53 | {{permission}} 54 | # endfor 55 | | 56 |{{utils.auth_icons(user_db)}} | 57 |
{{error}}
4 | # endfor 5 | # endmacro 6 | 7 | 8 | # macro field_description(field) 9 | # if field.description 10 |{{field.description}}
11 | # endif 12 | # endmacro 13 | 14 | 15 | # macro field_optional(field) 16 | # if not field.flags.required 17 | (optional) 18 | # endif 19 | # endmacro 20 | 21 | 22 | # macro input_field(field, prefix='', suffix='') 23 |{{help|safe}}
189 | # endif 190 |