Skip to content

Commit

Permalink
Enhance the community website homepage
Browse files Browse the repository at this point in the history
The enhancement includes addition of materialize
css, JQuery, responsiveness, and easy-navigation
of website features. The easy-navigatibility is
achieved by adding a navbar with display of meta
-review and gamification leaderboard on homepage.
Apart from this, the activity graph url is omitted
from website by displaying the graph itslef on the
homepage on large devices.

Closes coala#255
  • Loading branch information
KVGarg committed Jul 22, 2019
1 parent 4fcbf3c commit 446f353
Show file tree
Hide file tree
Showing 25 changed files with 994 additions and 193 deletions.
1 change: 1 addition & 0 deletions .ci/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ python manage.py fetch_deployed_data _site $ISSUES_JSON \

python manage.py migrate
python manage.py import_contributors_data
python manage.py create_org_cluster_map_and_activity_graph org_map
python manage.py import_issues_data
python manage.py import_merge_requests_data
python manage.py create_config_data
Expand Down
3 changes: 2 additions & 1 deletion .coafile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[all]
files = **.py, **.js, **.sh
ignore = .git/**, **/__pycache__/**, gci/client.py, */migrations/**, private/*, openhub/**
ignore = .git/**, **/__pycache__/**, gci/client.py, */migrations/**, private/*, openhub/**, **/leaflet_dist/**
max_line_length = 80
use_spaces = True
preferred_quotation = '
Expand Down Expand Up @@ -42,6 +42,7 @@ files = static/**/*.js
bears = JSHintBear
allow_unused_variables = True
javascript_strictness = False
environment_jquery = True

[all.yml]
bears = YAMLLintBear
Expand Down
1 change: 1 addition & 0 deletions .moban.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ packages:
- unassigned_issues

dependencies:
- getorg~=0.3.1
- git+https://gitlab.com/coala/coala-utils.git
- git-url-parse
- django>2.1,<2.2
Expand Down
5 changes: 3 additions & 2 deletions activity/scraper.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def get_data(self):
return self.data


def activity_json(request):
def activity_json(filename):

org_name = get_org_name()

Expand All @@ -152,4 +152,5 @@ def activity_json(request):
real_data = Scraper(parsed_json['issues'], datetime.datetime.today())
real_data = real_data.get_data()

return HttpResponse(json.dumps(real_data))
with open(filename, 'w+') as f:
json.dump(real_data, f, indent=4)
14 changes: 0 additions & 14 deletions community/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@
from django_distill import distill_url
from django.conf.urls.static import static
from django.conf import settings
from django.views.generic import TemplateView

from community.views import HomePageView, info
from gci.views import index as gci_index
from gci.feeds import LatestTasksFeed as gci_tasks_rss
from activity.scraper import activity_json
from twitter.view_twitter import index as twitter_index
from log.view_log import index as log_index
from data.views import index as contributors_index
Expand Down Expand Up @@ -87,18 +85,6 @@ def get_organization():
distill_func=get_index,
distill_file='info.txt',
),
distill_url(
r'static/activity-data.json', activity_json,
name='activity_json',
distill_func=get_index,
distill_file='static/activity-data.json',
),
distill_url(
r'activity/', TemplateView.as_view(template_name='activity.html'),
name='activity',
distill_func=get_index,
distill_file='activity/index.html',
),
distill_url(
r'gci/tasks/rss.xml', gci_tasks_rss(),
name='gci-tasks-rss',
Expand Down
105 changes: 96 additions & 9 deletions community/views.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,115 @@
from django.http import HttpResponse
from django.views.generic.base import TemplateView
import logging

import requests

from trav import Travis

from django.http import HttpResponse
from django.views.generic.base import TemplateView

from .git import (
get_deploy_url,
get_org_name,
get_owner,
get_upstream_deploy_url,
get_remote_url
)
from data.models import Team
from gamification.models import Participant as GamificationParticipant
from meta_review.models import Participant as MetaReviewer


def initialize_org_context_details():
org_name = get_org_name()
org_details = {
'name': org_name,
'blog_url': f'https://blog.{org_name}.io/',
'twitter_url': f'https://twitter.com/{org_name}_io/',
'facebook_url': f'https://www.facebook.com/{org_name}Analyzer',
'repo_url': get_remote_url().href,
'docs': f'https://{org_name}.io/docs',
'newcomer_docs': f'https://{org_name}.io/newcomer',
'coc': f'https://{org_name}.io/coc',
'logo_url': (f'https://api.{org_name}.io/en/latest/_static/images/'
f'{org_name}_logo.svg'),
'gitter_chat': f'https://gitter.im/{org_name}/{org_name}/',
'github_core_repo': f'https://github.com/{org_name}/{org_name}/',
'licence_type': 'GNU AGPL v3.0'
}
return org_details


def get_header_and_footer(context):
context['isTravis'] = Travis.TRAVIS
context['travisLink'] = Travis.TRAVIS_BUILD_WEB_URL
context['org'] = initialize_org_context_details()
print('Running on Travis: {}, build link: {}'.format(context['isTravis'],
context['travisLink']
))
return context


class HomePageView(TemplateView):
template_name = 'index.html'

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['isTravis'] = Travis.TRAVIS
context['travisLink'] = Travis.TRAVIS_BUILD_WEB_URL
def get_team_details(self, org_name):
teams = [
f'{org_name} newcomers',
f'{org_name} developers',
f'{org_name} admins'
]
team_details = {}
for team_name in teams:
team = Team.objects.get(name=team_name)
team_details[team_name] = team.contributors.count()
return team_details

def get_quote_of_the_day(self):

try:
qod = requests.get('http://quotes.rest/qod?category=inspire')
qod.raise_for_status()
except requests.HTTPError as err:
error_info = f'HTTPError while fetching Quote of the day! {err}'
logging.error(error_info)
return

print('Running on Travis: {}, build link: {}'.format(
context['isTravis'],
context['travisLink']))
qod_data = qod.json()
return {
'quote': qod_data['contents']['quotes'][0]['quote'],
'author': qod_data['contents']['quotes'][0]['author'],
}

def get_top_meta_review_users(self, count):
participants = MetaReviewer.objects.all()[:count]
return participants

def get_top_gamification_users(self, count):
return enumerate(GamificationParticipant.objects.all()[:count])

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context = get_header_and_footer(context)
org_name = context['org']['name']
context['org']['team_details'] = dict(self.get_team_details(org_name))
about_org = (f'{org_name} (always spelled with a lowercase c!) is one'
' of the welcoming open-source organizations for'
f' newcomers. {org_name} stands for “COde AnaLysis'
' Application” as it works well with animals and thus is'
' well visualizable which makes it easy to memorize.'
f' {org_name} provides a unified interface for linting'
' and fixing the code with a single configuration file,'
' regardless of the programming languages used. You can'
f' use {org_name} from within your favorite editor,'
' integrate it with your CI and, get the results as JSON'
', or customize it to your needs with its flexible'
' configuration syntax.')
context['org']['about'] = about_org
context['quote_details'] = self.get_quote_of_the_day()
context['top_meta_review_users'] = self.get_top_meta_review_users(
count=5)
context['top_gamification_users'] = self.get_top_gamification_users(
count=5)
return context


Expand Down
7 changes: 2 additions & 5 deletions data/contrib_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,11 @@ def get_contrib_data():
def import_data(contributor):
logger = logging.getLogger(__name__)
login = contributor.get('login', None)
teams = contributor.get('teams')
teams = contributor.pop('teams')
try:
contributor['issues_opened'] = contributor.pop('issues')
contributor['num_commits'] = contributor.pop('contributions')
contributor_location = contributor.get('location')
if contributor_location:
contributor['location'] = contributor_location
contributor.pop('teams')
contributor['location'] = contributor.get('location')
c, create = Contributor.objects.get_or_create(
**contributor
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django.core.management.base import BaseCommand

from data.org_cluster_map_handler import handle as org_cluster_map_handler
from activity.scraper import activity_json


class Command(BaseCommand):
help = 'Create a cluster map using contributors geolocation'

def add_arguments(self, parser):
parser.add_argument('output_dir', nargs='?', type=str)

def handle(self, *args, **options):
output_dir = options.get('output_dir')
if not output_dir:
org_cluster_map_handler()
else:
org_cluster_map_handler(output_dir)
# Fetch & Store data for activity graph to be displayed on home-page
activity_json('static/activity-data.js')
18 changes: 18 additions & 0 deletions data/migrations/0006_auto_20190615_1331.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.1.7 on 2019-06-15 13:31

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('data', '0005_contributor_location'),
]

operations = [
migrations.AlterField(
model_name='contributor',
name='teams',
field=models.ManyToManyField(related_name='contributors', to='data.Team'),
),
]
2 changes: 1 addition & 1 deletion data/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class Contributor(models.Model):
reviews = models.IntegerField(default=None, null=True)
issues_opened = models.IntegerField(default=None, null=True)
location = models.TextField(default=None, null=True)
teams = models.ManyToManyField(Team)
teams = models.ManyToManyField(Team, related_name='contributors')

def __str__(self):
return self.login
Expand Down
Loading

0 comments on commit 446f353

Please sign in to comment.