Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
moacirmoda committed Nov 24, 2016
2 parents e882b34 + 9e9070e commit 1847cdc
Show file tree
Hide file tree
Showing 601 changed files with 2,408 additions and 238,925 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -59,6 +59,7 @@ settings_local.py
/.cache
/node_modules
/themes/default/templates/version.txt
bower_components/

# Vagrant
.vagrant
Expand Down
17 changes: 8 additions & 9 deletions Dockerfile
@@ -1,16 +1,18 @@
FROM debian:jessie
MAINTAINER Fabio Montefuscolo <fabio.montefuscolo@hacklab.com.br>
MAINTAINER Bruno Martin <bruno@hacklab.com.br>

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update \
&& apt-get install -y python python-pip python-dev \
&& apt-get install -y libpq-dev libjpeg-dev libpng12-dev gettext \
&& apt-get install -y nginx supervisor \
&& apt-get install -y npm git
&& apt-get install -y curl git

RUN ln -s /usr/bin/nodejs /usr/bin/node
RUN npm install -g phantomjs-prebuilt bower
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
# The installer already run apt-get update
&& apt-get install -y nodejs

RUN useradd -m -d /app -u 1000 -s /bin/bash timtec
RUN mkdir -p /app
Expand All @@ -26,18 +28,15 @@ COPY . /app/timtec
RUN mkdir -p /app/webfiles/static \
&& mkdir -p /app/webfiles/media \
&& pip install -r /app/timtec/requirements/production.txt \
# FIXME needed when DEBUG == True in settings.py
&& pip install -r /app/timtec/requirements/local.txt \
&& chown -R timtec /app

WORKDIR /app/timtec
USER timtec

RUN npm install \
&& node bower install \
&& node node_modules/grunt-cli/bin/grunt \
&& python manage.py compilemessages \
&& python manage.py collectstatic --noinput \
&& python manage.py compile_pyc --path /app/timtec \
&& python manage.py collectstatic --noinput
&& /app/timtec/node_modules/bower/bin/bower install

USER root
EXPOSE 80 8000
Expand Down
21 changes: 14 additions & 7 deletions Makefile
Expand Up @@ -22,32 +22,42 @@ define base_update
npm install
~/env/bin/python manage.py migrate --noinput --fake-initial
~/env/bin/python manage.py collectstatic --noinput
~/env/bin/python manage.py compress
~/env/bin/python manage.py compilemessages
touch ~/wsgi-reload
endef

update:
~/env/bin/pip install --upgrade pip
~/env/bin/pip install -U -r requirements/production.txt
npm install
./node_modules/bower/bin/bower install
~/env/bin/python manage.py migrate --noinput --fake-initial
~/env/bin/python manage.py collectstatic --noinput
~/env/bin/python manage.py compress
~/env/bin/python manage.py compilemessages
touch ~/wsgi-reload

install:
virtualenv ~/env
~/env/bin/pip install --upgrade pip
~/env/bin/pip install -r requirements/production.txt
npm install
./node_modules/bower/bin/bower install
mkdir -p ~/webfiles/static
mkdir -p ~/webfiles/media
cp timtec/settings_local.py.template timtec/settings_local.py
~/env/bin/python manage.py migrate --noinput
~/env/bin/python manage.py loaddata initial
~/env/bin/python manage.py collectstatic --noinput
~/env/bin/python manage.py compress
~/env/bin/python manage.py compilemessages
touch ~/wsgi-reload

docker-update:
npm install
/app/timtec/node_modules/bower/bin/bower install
python manage.py migrate --noinput --fake-initial
python manage.py compress
python manage.py collectstatic --noinput
python manage.py compilemessages

create-staging:
virtualenv ~/env
Expand All @@ -63,7 +73,6 @@ create-production: create-staging
~/env/bin/python manage.py migrate --noinput --no-initial-data
~/env/bin/python manage.py collectstatic --noinput
~/env/bin/python manage.py compilemessages
touch ~/wsgi-reload

update-test:
$(call resetdb_to_backup,timtec-test)
Expand Down Expand Up @@ -118,8 +127,8 @@ setup_coveralls:
pip install -q coveralls

setup_js:

npm install # --loglevel silent
./node_modules/bower/bin/bower install

setup_django: clean
python manage.py migrate --noinput
Expand Down Expand Up @@ -161,5 +170,3 @@ doc_build:
doc_run:
make doc_update
docs/env/bin/mkdocs serve

docker_dev:
9 changes: 1 addition & 8 deletions README.md
Expand Up @@ -33,7 +33,7 @@ Para acessar a documentação completa, veja a pasta [docs](docs) na raiz da apl


## Desenvolvimento
* [Criando ambiente de dev](docs/instalacao_e_configuracao/%5BDev%5D-Instalação-no-Archlinux.rst)
* [Criando ambiente de dev](docs/instalacao_e_configuracao/Criando-Ambiente-de-Desenvolvimento.md)
* [Temas](docs/instalacao_e_configuracao/Temas.md)
* [Tutorial para criação de tema](docs/instalacao_e_configuracao/Tutorial-para-criação-de-tema.md)

Expand Down Expand Up @@ -147,12 +147,5 @@ Activate virtual env, then:

make python_tests

### Angular

In the root of repository:

make karma_tests


### Suporte
[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/hacklabr/timtec?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
6 changes: 3 additions & 3 deletions accounts/serializers.py
Expand Up @@ -3,9 +3,9 @@


class TimtecUserSerializer(serializers.ModelSerializer):
name = serializers.Field(source='get_full_name')
picture = serializers.Field(source='get_picture_url')
is_profile_filled = serializers.BooleanField(source='is_profile_filled')
name = serializers.ReadOnlyField(source='get_full_name')
picture = serializers.ReadOnlyField(source='get_picture_url')
is_profile_filled = serializers.BooleanField()

class Meta:
model = get_user_model()
Expand Down
31 changes: 16 additions & 15 deletions accounts/views.py
Expand Up @@ -28,7 +28,7 @@ class ProfileEditView(LoginRequiredMixin, UpdateView):
template_name = 'profile-edit.html'

def get_success_url(self):
url = self.request.REQUEST.get('next', None)
url = self.request.GET.get('next', None)
if url:
return url
else:
Expand Down Expand Up @@ -91,10 +91,10 @@ class TimtecUserAdminViewSet(viewsets.ModelViewSet):
# search_fields = ('first_name', 'last_name', 'username', 'email')

def get_queryset(self):
page = self.request.QUERY_PARAMS.get('page')
keyword = self.request.QUERY_PARAMS.get('keyword')
admin = self.request.QUERY_PARAMS.get('admin')
blocked = self.request.QUERY_PARAMS.get('blocked')
page = self.request.query_params.get('page')
keyword = self.request.query_params.get('keyword')
admin = self.request.query_params.get('admin')
blocked = self.request.query_params.get('blocked')
queryset = super(TimtecUserAdminViewSet, self).get_queryset().order_by('username')

if keyword:
Expand Down Expand Up @@ -130,7 +130,7 @@ class UserSearchView(LoginRequiredMixin, generics.ListAPIView):

def get_queryset(self):
queryset = self.model.objects.all()
query = self.request.QUERY_PARAMS.get('name', None)
query = self.request.query_params.get('name', None)
if query is not None:
queryset = queryset.filter(Q(first_name__icontains=query) |
Q(last_name__icontains=query) |
Expand All @@ -146,17 +146,18 @@ class StudentSearchView(LoginRequiredMixin, generics.ListAPIView):

def get_queryset(self):
queryset = self.model.objects.all()
course = self.request.QUERY_PARAMS.get('course', None)
course = self.request.query_params.get('course', None)

# classes = self.request.user.professor_classes.all()
classes = self.request.user.professor_classes.all()

if classes:
queryset = queryset.filter(classes__in=classes)
else:
# FIXME: if every student is in a class, this is useless.
if course is not None:
queryset = queryset.filter(studentcourse_set=course)
query = self.request.query_params.get('name', None)

# if classes:
# queryset = queryset.filter(classes__in=classes)
# else:
# FIXME: if every student is in a class, this is useless.
if course is not None:
queryset = queryset.filter(studentcourse_set=course)
query = self.request.QUERY_PARAMS.get('name', None)
if query is not None:
queryset = queryset.filter(Q(first_name__icontains=query) |
Q(last_name__icontains=query) |
Expand Down
19 changes: 19 additions & 0 deletions activities/migrations/0002_activity_image.py
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('activities', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='activity',
name='image',
field=models.ImageField(upload_to=b'activities', null=True, verbose_name='Image', blank=True),
),
]
20 changes: 20 additions & 0 deletions activities/migrations/0003_auto_20160730_1743.py
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
import jsonfield.fields


class Migration(migrations.Migration):

dependencies = [
('activities', '0002_activity_image'),
]

operations = [
migrations.AlterField(
model_name='activity',
name='data',
field=jsonfield.fields.JSONField(verbose_name='Data', blank=True),
),
]
10 changes: 8 additions & 2 deletions activities/models.py
Expand Up @@ -24,12 +24,13 @@ class Activity(models.Model):
expected_answer_data: {choice: 1}
"""
type = models.CharField(_('Type'), max_length=255)
data = JSONField(_('Data'))
data = JSONField(_('Data'), blank=True)
expected = JSONField(_('Expected answer'), blank=True)
unit = models.ForeignKey(Unit, verbose_name=_('Unit'), null=True, blank=True, related_name='activities')
comment = models.TextField(_('Comment'), blank=True)
positive_feedback = models.TextField(_('Positive Feedback'), blank=True)
negative_feedback = models.TextField(_('Negative Feedback'), blank=True)
image = models.ImageField(_('Image'), upload_to='activities', null=True, blank=True)

class Meta:
verbose_name = _('Activity')
Expand All @@ -42,6 +43,11 @@ def question(self):
except:
return None

def get_image_url(self):
if self.image:
return '{}/{}'.format(settings.MEDIA_URL, self.image)
return ''

def __unicode__(self):
return u'%s dt %s a %s' % (self.type, self.data, self.expected)

Expand All @@ -65,7 +71,7 @@ def expected(self):

def is_correct(self):

if self.activity.type in ['html5', 'markdown', 'php']:
if self.activity.type in ['html5', 'markdown', 'php', 'image']:
return True

if type(self.given) is list and type(self.activity.expected) is list:
Expand Down
27 changes: 16 additions & 11 deletions activities/serializers.py
Expand Up @@ -2,36 +2,41 @@
from rest_framework import serializers


class JSONSerializerField(serializers.WritableField):
pass


class ActivitySerializer(serializers.ModelSerializer):
data = JSONSerializerField('data')
expected = JSONSerializerField('expected', required=False)

data = serializers.JSONField()
expected = serializers.JSONField(required=False)
image_url = serializers.SerializerMethodField()

class Meta:
model = Activity
fields = ('id', 'comment', 'data', 'expected', 'type', 'unit', 'positive_feedback', 'negative_feedback')
fields = ('id', 'comment', 'data', 'expected', 'type', 'unit', 'image_url', 'positive_feedback', 'negative_feedback')

@staticmethod
def get_image_url(obj):
if obj.image:
return obj.image.url
return ''


class AnswerSerializer(serializers.ModelSerializer):
user = serializers.Field(source='user')
user_id = serializers.Field(source='user.id')
correct = serializers.Field(source='is_correct')
given = JSONSerializerField('given')
given = serializers.JSONField('given')
positive_feedback = serializers.Field('activity.positive_feedback')
negative_feedback = serializers.Field('activity.negative_feedback')

class Meta:
model = Answer
allow_add_remove = True
fields = ('id', 'activity', 'correct', 'user', 'user_id', 'timestamp', 'given', 'positive_feedback', 'negative_feedback')
fields = ('id', 'activity', 'correct', 'user', 'user_id', 'timestamp',
'given', 'positive_feedback', 'negative_feedback')


class ActivityImportExportSerializer(serializers.ModelSerializer):
data = JSONSerializerField('data')
expected = JSONSerializerField('expected', required=False)
data = serializers.JSONField()
expected = serializers.JSONField(required=False)

class Meta:
model = Activity
Expand Down
23 changes: 22 additions & 1 deletion activities/static/js/activities/controllers.js
@@ -1,7 +1,7 @@
(function(angular){
'use strict';

var app = angular.module('activities.controllers', []);
var app = angular.module('activities.controllers', ['ngSanitize']);

app.controller('PHPCtrl', ['$scope', '$sce', 'Progress',
function ($scope, $sce, Progress) {
Expand Down Expand Up @@ -77,4 +77,25 @@
$scope.possibleAnswers.sort(compareNumbers);
}
]);

app.controller('DiscussionActivityCtrl', [
'$scope',
'$sce',

function ($scope, $sce) {
$scope.activity_open = true;
var now = Date.now();

// Decide the current state of the activity
if(now < $scope.currentActivity.data[0].start_date){
// The Activity is not open yet
$scope.activity_open = false;
} else if(now > $scope.currentActivity.data[0].end_date){
// The Activity is already expired
$scope.activity_expired = true;
}


}
]);
})(angular);

0 comments on commit 1847cdc

Please sign in to comment.