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 https://gitlab.com/coala/GSoC/gsoc-2019/issues/142
  • Loading branch information
KVGarg committed Jun 14, 2019
1 parent 610f8d1 commit 2362349
Show file tree
Hide file tree
Showing 20 changed files with 886 additions and 185 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
99 changes: 92 additions & 7 deletions community/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,106 @@
get_org_name,
get_owner,
get_upstream_deploy_url,
get_remote_url
)
from data.models import Team, Contributor


def initialize_org_context_details():
org_name = get_org_name()
org_details = {
'name': org_name,
'blog_url': 'https://blog.{}.io/'.format(org_name),
'twitter_url': 'https://twitter.com/{}_io/'.format(org_name),
'facebook_url': 'https://www.facebook.com/{}Analyzer'.format(
org_name),
'repo_url': get_remote_url().href,
'docs': 'http://{}.io/docs'.format(org_name),
'newcomer_docs': 'http://{}.io/newcomer'.format(org_name),
'coc': 'http://{}.io/coc'.format(org_name),
'logo_url': ('https://api.{}.io/en/latest/_static/images/'
'{}_logo.svg'.format(org_name, org_name)),
'gitter_chat': 'https://gitter.im/{}/{}/'.format(org_name,
org_name),
'github_core_repo': 'https://github.com/{}/{}/'.format(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 = get_org_name()
teams = [
'{} newcomers'.format(org_name),
'{} developers'.format(org_name),
'{} admins'.format(org_name)
]
team_details = {}
for team in teams:
team_objs = [Team.objects.get(name=team), ]
contributors = Contributor.objects.filter(teams__in=team_objs)
team_details[team] = contributors.count()
return team_details

def get_quote_of_the_day(self):
import requests
qod = requests.get('http://quotes.rest/qod?category=inspire')
qod_data = qod.json()
if qod.status_code == 429:
return None
return {
'quote': qod_data['contents']['quotes'][0]['quote'],
'author': qod_data['contents']['quotes'][0]['author'],
}

def get_top_meta_review_users(self, count):
from meta_review.models import Participant
participants = Participant.objects.all()[:count]
for contrib in participants:
contrib.score = int(contrib.score)
return participants

print('Running on Travis: {}, build link: {}'.format(
context['isTravis'],
context['travisLink']))
def get_top_gamification_users(self, count):
from gamification.models import Participant
return enumerate(Participant.objects.all()[:count])

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context = get_header_and_footer(context)
context['org']['team_details'] = dict(self.get_team_details())
org_name = context['org']['name']
about_org = ('{org_name} (always spelled with a lowercase c!) is one'
' of the welcoming open-source organizations for'
' 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.'
' {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'
' 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.'.format(org_name=org_name))
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
119 changes: 119 additions & 0 deletions data/management/commands/create_org_cluster_map_and_activity_graph.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import logging
import json
import getorg
import os

from django.core.management.base import BaseCommand

from data.models import Contributor
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):
logger = logging.getLogger(__name__)
output_dir = options.get('output_dir')

if not output_dir:
logger.debug('output_dir arg not provided! Setting output_dir'
' to cluster_map/')
output_dir = 'cluster_map'

class Location:

def __init__(self, longitude, latitude):
self.longitude = longitude
self.latitude = latitude

org_location_dict = {}

for contrib in Contributor.objects.all():
if not contrib.login.startswith('testuser') and contrib.location:
user_location = json.loads(contrib.location)
location = Location(user_location['longitude'],
user_location['latitude'])
org_location_dict[contrib.login] = location
logger.debug('{} location {} added on map'.format(
contrib.login, user_location))
getorg.orgmap.output_html_cluster_map(org_location_dict,
folder_name=output_dir)

self.move_and_make_changes_in_files(output_dir)

# Fetch data for activity graph to be displayed on home-page
activity_json('static/activity-data.js')

def move_and_make_changes_in_files(self, output_dir):
# Move leaflet_dist folder to static folder
leaflet_source_path = '{}/{}/leaflet_dist/'.format(os.getcwd(),
output_dir)
leaflet_destination_path = '{}/{}/leaflet_dist/'.format(os.getcwd(),
'static')
os.renames(leaflet_source_path, leaflet_destination_path)
# Move org_locations.js to static folder
locations_source_path = '{}/{}/org-locations.js'.format(os.getcwd(),
output_dir)
locations_destination_path = '{}/{}/org-locations.js'.format(
os.getcwd(), 'static')
os.rename(locations_source_path, locations_destination_path)
# Change map.html to support django
with open('{}/map.html'.format(output_dir)) as f:
django_supported_htmls = []
lines = f.readlines()
for index in range(len(lines)):
line = lines[index].strip()
if line.__contains__('<html>'):
django_supported_htmls.append('{% load staticfiles %}\n')
django_supported_htmls.append(line+'\n')
elif line.__contains__('</head>'):
adjust_prop = '''
<style>
#map {
width: 60%;
height: 300px;
margin: auto;
box-shadow: 0px 0px 25px 2px;
}
@media only screen and (max-width:750px){
#map {
width: 90%
}
}
</style>\n
'''
meta_charset = '<meta charset="utf-8">'
adjust_prop = adjust_prop.strip().replace(' ', '')
django_supported_htmls.insert(6, meta_charset+'\n')
django_supported_htmls.append(adjust_prop+'\n')
django_supported_htmls.append(line+'\n')
elif line.__contains__('https://'):
line = line.replace('https:', '').replace(' />', '>')
django_supported_htmls.append(line.strip()+'\n')
elif line.__contains__('<link '):
line = line.replace('href="', 'href="{% static \'')
line = line.replace('.css', '.css\' %}').replace(' />', '>')
django_supported_htmls.append(line+'\n')
elif line.__contains__('<script '):
line = line.replace('src="', 'src="{% static \'')
line = line.replace('.js', '.js\' %}')
if line.__contains__(' type="text/javascript"'):
line = line.replace(' type="text/javascript"', '')
django_supported_htmls.append(line+'\n')
elif line.__contains__('Mouse over') or len(line) == 0:
pass
else:
django_supported_htmls.append(line+'\n')
# Add map.html to templates folder
html_map_path = '{}/{}/map.html'
html_map_source_path = html_map_path.format(os.getcwd(),
output_dir)
html_map_destination_path = html_map_path.format(os.getcwd(),
'templates')
os.remove(html_map_source_path)
with open(html_map_destination_path, 'w+') as f:
f.writelines(django_supported_htmls)
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
getorg~=0.3.1
git+https://gitlab.com/coala/coala-utils.git
git-url-parse
django>2.1,<2.2
Expand Down
Loading

0 comments on commit 2362349

Please sign in to comment.