# HG changeset patch # User rougeronj # Date 1433869505 -7200 # Node ID ea633c8f9bfa66c140ef24df7f64c65e08041035 # Parent 41a78460bdac1f167022044e7bafc20ca0fb9f43 add exposition table and update the views to include the new foreign key to the exposition table diff -r 41a78460bdac -r ea633c8f9bfa server/src/ammico/admin.py --- a/server/src/ammico/admin.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/ammico/admin.py Tue Jun 09 19:05:05 2015 +0200 @@ -5,7 +5,7 @@ from django.contrib.auth.forms import ReadOnlyPasswordHashField from django.contrib.auth.models import Group -from ammico.models import Slide, Book +from ammico.models import Slide, Book, Exposition class UserCreationForm(forms.ModelForm): @@ -83,5 +83,6 @@ admin.site.register(get_user_model()) admin.site.unregister(Group) -admin.site.register(Slide) -admin.site.register(Book) \ No newline at end of file +admin.site.register(Exposition) +admin.site.register(Book) +admin.site.register(Slide) \ No newline at end of file diff -r 41a78460bdac -r ea633c8f9bfa server/src/ammico/migrations/0001_initial.py --- a/server/src/ammico/migrations/0001_initial.py Fri Jun 05 16:10:12 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -from django.conf import settings -import taggit.managers -import datetime - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('taggit', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Book', - fields=[ - ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), - ('idArticle', models.CharField(max_length=512, null=True, blank=True)), - ('title', models.CharField(max_length=512, blank=True)), - ('description', models.CharField(max_length=512, null=True, blank=True)), - ('image', models.URLField(max_length=2048, blank=True)), - ('date', models.DateTimeField(default=datetime.datetime.now)), - ('public', models.BooleanField(default=False, db_index=True)), - ('parent_visit', models.ForeignKey(null=True, related_name='books_copy', to='ammico.Book', blank=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='books')), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='Slide', - fields=[ - ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), - ('idStop', models.CharField(max_length=512, blank=True)), - ('idInventory', models.CharField(max_length=512, blank=True)), - ('title', models.CharField(max_length=512, blank=True)), - ('description', models.CharField(max_length=1024, blank=True)), - ('image', models.URLField(max_length=2048, blank=True)), - ('date', models.DateTimeField(default=datetime.datetime.now)), - ('favorite', models.BooleanField(default=False, db_index=True)), - ('book', models.ForeignKey(to='ammico.Book', related_name='slides')), - ('tags', taggit.managers.TaggableManager(through='taggit.TaggedItem', help_text='A comma-separated list of tags.', to='taggit.Tag', verbose_name='Tags', blank=True)), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.AlterOrderWithRespectTo( - name='slide', - order_with_respect_to='book', - ), - ] diff -r 41a78460bdac -r ea633c8f9bfa server/src/ammico/models.py --- a/server/src/ammico/models.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/ammico/models.py Tue Jun 09 19:05:05 2015 +0200 @@ -3,12 +3,13 @@ from django.db import models from taggit.managers import TaggableManager -import settings +from django.conf import settings class Book(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name = "books") - idArticle = models.CharField(max_length=512, blank=True, null=True) + exposition = models.ForeignKey("Exposition", related_name = "exposition") + id_article = models.CharField(max_length=512, blank=True, null=True) title = models.CharField(max_length=512, blank=True) description = models.CharField(max_length=512, blank=True, null=True) image = models.URLField(max_length=2048, blank=True) @@ -21,8 +22,8 @@ class Slide(models.Model): book = models.ForeignKey(Book, related_name = "slides") - idStop = models.CharField(max_length=512, blank=True) - idInventory = models.CharField(max_length=512, blank=True) + id_stop = models.CharField(max_length=512, blank=True) + id_inventory = models.CharField(max_length=512, blank=True) title = models.CharField(max_length=512, blank=True) description = models.CharField(max_length=1024, blank=True) image = models.URLField(max_length=2048, blank=True) @@ -31,7 +32,18 @@ tags = TaggableManager(blank=True) def __str__(self): - return self.idStop + return self.id_stop class Meta: - order_with_respect_to = 'book' \ No newline at end of file + order_with_respect_to = 'book' + +class Exposition(models.Model): + title = models.CharField(max_length=512, blank=True) + description = models.CharField(max_length=1024, blank=True) + url_exalead = models.URLField(max_length=2048, blank=True) + url_orpheo = models.URLField(max_length=2048, blank=True) + url_jamespot = models.URLField(max_length=2048, blank=True) + active = models.BooleanField(default=True, db_index=True) + + def __str__(self): + return self.title \ No newline at end of file diff -r 41a78460bdac -r ea633c8f9bfa server/src/ammico/serializers/ammico.py --- a/server/src/ammico/serializers/ammico.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/ammico/serializers/ammico.py Tue Jun 09 19:05:05 2015 +0200 @@ -13,7 +13,7 @@ class Meta: model = Book - fields = ('id', 'user', 'idArticle', 'parent_visit', 'title', 'description', 'image', 'date', 'count', 'public') + fields = ('id', 'user', 'id_article', 'parent_visit', 'title', 'description', 'image', 'date', 'count', 'public') class SlideSerializer(TaggitSerializer, serializers.ModelSerializer): details = serializers.SerializerMethodField('getStopInfo') @@ -21,7 +21,7 @@ tags = TagListSerializerField(required=False) def getStopInfo(self, slide): - if (slide.idInventory != ""): + if (slide.id_inventory != ""): #slide added from searched in MIMO database return extractFromMIMO(slide) else: @@ -35,4 +35,4 @@ class Meta: model = Slide - fields = ('id', 'index', 'book', 'idStop', 'idInventory', 'title', 'description', 'image', 'date', 'favorite', 'tags', 'details') \ No newline at end of file + fields = ('id', 'index', 'book', 'id_stop', 'id_inventory', 'title', 'description', 'image', 'date', 'favorite', 'tags', 'details') \ No newline at end of file diff -r 41a78460bdac -r ea633c8f9bfa server/src/ammico/serializers/extractors.py --- a/server/src/ammico/serializers/extractors.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/ammico/serializers/extractors.py Tue Jun 09 19:05:05 2015 +0200 @@ -5,13 +5,12 @@ import xmltodict from ammico.utils import fetchJson, MyHTMLParser -from config import URL_EXALEAD, URL_JAMESPOT, URL_ORPHEO def extractFromMIMO(slide): details = {} - params = {'of': 'json', 'q': 'record_inventorynumber:' + slide.idInventory} - data = requests.get(URL_EXALEAD, params=params) + params = {'of': 'json', 'q': 'record_inventorynumber:' + slide.id_inventory} + data = requests.get(slide.book.exposition.url_exalead, params=params) results = json.loads(data.content.decode('utf-8')) if (len(results['hits']) == 1): for i in results['hits'][0]['metas']: @@ -25,9 +24,9 @@ def extractFromJameSpot(slide): details={} - stopList = fetchJson(URL_JAMESPOT + '&f=list&o=article&type=stop&itemFormat=article') + stopList = fetchJson(slide.book.exposition.url_jamespot + '&f=list&o=article&type=stop&itemFormat=article') for stops in stopList: - if (slide.idStop == stops['idStop']): + if (slide.id_stop == stops['idStop']): details = stops details.setdefault('images', []).append(details.pop('firstImg')) details['description'] = details.pop('captionImg') @@ -35,14 +34,14 @@ def extractFromOrpheo(slide): details = {} - params = {'id': slide.idStop.replace('stop-', '')} - data = requests.get(URL_ORPHEO, params=params) + params = {'id': slide.id_stop.replace('stop-', '')} + data = requests.get(slide.book.exposition.url_orpheo, params=params) parsed_data = xmltodict.parse(data.content.decode('utf-8')) if ('item' in parsed_data['result']): details = { 'title': parsed_data['result']['item']['title'], - 'idInventory': parsed_data['result']['item']['Numero_inventaire'], + 'id_inventory': parsed_data['result']['item']['Numero_inventaire'], } parser = MyHTMLParser() diff -r 41a78460bdac -r ea633c8f9bfa server/src/ammico/urls.py --- a/server/src/ammico/urls.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/ammico/urls.py Tue Jun 09 19:05:05 2015 +0200 @@ -1,15 +1,18 @@ from django.conf.urls import patterns, url, include -from ammico.views import ListBooks, InfoBook, ListSlides, InfoSlide, SlidesOrder, PublicBooks, AmmicoView +from ammico.views import ListBooks, InfoBook, ListSlides, InfoSlide, SlidesOrder, PublicBooks, AmmicoView, api_root urlpatterns = patterns('', - url(r'^$', AmmicoView.as_view(), name='index'), - url(r'^books$', ListBooks.as_view()), - url(r'^books/(?P[0-9]+)$', InfoBook.as_view()), - url(r'^books/(?P[0-9]+)/order$', SlidesOrder.as_view()), - url(r'^public', PublicBooks.as_view()), - url(r'^slides$', ListSlides.as_view()), - url(r'^slides/(?P[0-9]+)$', InfoSlide.as_view()), - url(r'^auth/', include('authentication.urls')), + + url(r'^(?P[0-9]*)$', AmmicoView.as_view(), name='index'), + url(r'^books$', ListBooks.as_view(), name='books'), + url(r'^books/(?P[0-9]+)$', InfoBook.as_view(), name='book'), + url(r'^books/(?P[0-9]+)/order$', SlidesOrder.as_view(), name='order'), + url(r'^public', PublicBooks.as_view(), name='publicBooks'), + url(r'^slides$', ListSlides.as_view(), name='slides'), + url(r'^slides/(?P[0-9]+)$', InfoSlide.as_view(), name='slide'), + url(r'^auth/', include('authentication.urls', namespace="authentication")), + + url(r'^$', api_root, name='api-root'), ) diff -r 41a78460bdac -r ea633c8f9bfa server/src/ammico/views.py --- a/server/src/ammico/views.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/ammico/views.py Tue Jun 09 19:05:05 2015 +0200 @@ -3,51 +3,54 @@ from datetime import datetime import json +from django.conf import settings from django.contrib.auth import get_user_model +from django.core.urlresolvers import reverse, reverse_lazy from django.http import HttpResponse from django.shortcuts import render from django.utils.dateparse import parse_datetime +from django.views.generic import View +import jwt import requests from rest_framework import status from rest_framework.authentication import TokenAuthentication from rest_framework.authtoken.models import Token +from rest_framework.decorators import api_view from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.response import Response from rest_framework.views import APIView -from ammico.models import Book, Slide +from ammico.models import Book, Slide, Exposition from ammico.serializers.ammico import BookSerializer, SlideSerializer -from config import AUTH_JAMESPOT -import jwt -from settings import URL_JAMESPOT #from django.contrib.auth import login, logout User = get_user_model() -def populateVisit(user): +def populateVisit(user, idExpo): # send request with usermail to get the visits of this user and add it to the database #r = requests.get('http://fui-ammico.jamespot.pro/api/api.php?&k=6c8bfcea247e8a5841288269887d88f0&d=2016-01-31&m=EXT-IRI&v=2.0&f=get&o=article&idArticle=169') #simulate the request params = {'o': 'article', 'f': 'list', 'idUser': user.idUser} - r = requests.get(URL_JAMESPOT, params=params) + r = requests.get(settings.URL_JAMESPOT, params=params) visits = json.loads(r.content.decode('utf-8')) for visit in visits['VAL']: params = {'o' : 'article', 'f' : 'get', 'idArticle' : visit['idArticle']} - r = requests.get(URL_JAMESPOT, params=params) + r = requests.get(settings.URL_JAMESPOT, params=params) visitInfo = json.loads(r.content.decode('utf-8'))['VAL'] - if (not Book.objects.filter(idArticle=visit['idArticle']).exists()): + if (not Book.objects.filter(id_article=visit['idArticle']).exists()): book = Book.objects.create( user=user, - idArticle=visitInfo['idArticle'], + exposition = Exposition.objects.get(id=idExpo), + id_article=visitInfo['idArticle'], title = visitInfo['title'], description = visitInfo['description'], image = visitInfo['image'], - date = parse_datetime(visitInfo['dateCreation']) + date = parse_datetime(visitInfo['dateCreation']), ) populateSlide(json.loads(visitInfo['steps']), book) @@ -62,27 +65,44 @@ Slide.objects.update_or_create( book=book, - idStop=step['stop'], + id_stop=step['stop'], defaults={ 'description' : description, 'date' : parse_datetime(str(datetime.strptime(step['DATE'] + " " + step['TIME'], "%d/%m/%Y %H:%M:%S"))) } ) - -class AmmicoView(APIView): - permission_classes = (AllowAny,) + +@api_view(('GET',)) +def api_root(request, format=None): + return Response({ + 'books': reverse('books', request=request, format=format), + 'slides': reverse('slides', request=request, format=format) + }) - def get(self, request): - key = '' - if ('k' in request.GET): - payload = jwt.decode(request.GET['k'], AUTH_JAMESPOT, algorithms=['HS256']) - if (('email' and 'idUser') in payload): - user, _ = User.objects.get_or_create(email = payload['email'], idUser = payload['idUser']) - populateVisit(user) - token, _ = Token.objects.get_or_create(user=user) - key = str(token.key) - - return render(request, 'index.html', {'token': key}) +class AmmicoView(View): + def get(self, request, idExpo): + if (idExpo and Exposition.objects.filter(id=idExpo).exists()): + key = '' + if ('k' in request.GET): + payload = jwt.decode(request.GET['k'], settings.AUTH_JAMESPOT, algorithms=['HS256']) + print(payload) + if (('email' and 'idUser') in payload): + print('here !'); + user, _ = User.objects.get_or_create(email = payload['email'], idUser = payload['idUser']) + populateVisit(user, idExpo) + token, _ = Token.objects.get_or_create(user=user) + key = str(token.key) + print(reverse_lazy('ammico:api-root')) + context = { + 'token': key, + 'idExpo': idExpo, + 'ammicoUrl': request.build_absolute_uri(reverse('ammico:api-root')), + 'searchUrl': settings.URL_EXALEAD + } + return render(request, 'indexAmmico.html', {'context': context}) + else: + expositions = Exposition.objects.all() + return render(request, 'index.html', {'expositions' : expositions}) class PublicBooks(APIView): @@ -98,6 +118,8 @@ Return a list of all Books. """ books = Book.objects.filter(public=True) + if 'idExpo' in request.GET: + books = books.filter(exposition = request.GET['idExpo']) serializer = BookSerializer(books, many=True) return Response(serializer.data) @@ -114,6 +136,8 @@ Return a list of all Books. """ books = Book.objects.filter(user = request.user.id) + if 'idExpo' in request.GET: + books = books.filter(exposition = request.GET['idExpo']) serializer = BookSerializer(books, many=True) return Response(serializer.data) @@ -122,8 +146,12 @@ Add a Book """ + if ('idExpo' not in request.GET): + return Response("please specify a correct idExpo as a get parameter", status=status.HTTP_400_BAD_REQUEST) + DEFAULTS = { "user":request.user.id, + "exposition": request.GET['idExpo'] } if ('idParent' in request.data): @@ -133,7 +161,7 @@ return Response(status=status.HTTP_400_BAD_REQUEST) new_book = deepcopy(book) new_book.title = request.data['title'] - new_book.idArticle = None + new_book.id_article = None new_book.parent_visit = book new_book.id = None new_book.save() @@ -182,7 +210,7 @@ except Book.DoesNotExist: return Response(status=status.HTTP_204_NO_CONTENT) - if (book.idArticle): + if (book.id_article): return Response(status=status.HTTP_403_FORBIDDEN) serializer = BookSerializer(book, data=request.data) @@ -200,7 +228,7 @@ except Book.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) - if (book.idArticle): + if (book.id_article): return Response(status=status.HTTP_403_FORBIDDEN) book.delete() @@ -236,7 +264,7 @@ except Book.DoesNotExist: return Response(status=status.HTTP_204_NO_CONTENT) - if (book.idArticle): + if (book.id_article): return Response(status=status.HTTP_403_FORBIDDEN) book.set_slide_order(request.data['order']) @@ -275,7 +303,7 @@ book = Book.objects.get(user = request.user.id, id=request.data['book']) except Book.DoesNotExist: return Response(status=status.HTTP_204_NO_CONTENT) - if (book.idArticle): + if (book.id_article): return Response(status=status.HTTP_403_FORBIDDEN) serializer = SlideSerializer(data=request.data) @@ -313,8 +341,9 @@ except Slide.DoesNotExist: return HttpResponse(status=status.HTTP_204_NO_CONTENT) - if (slide.book.idArticle): - return Response(status=status.HTTP_403_FORBIDDEN) + if (slide.book.id_article): + slide.favorite=request.data['favorite'] + return Response(status=status.HTTP_200_OK) serializer = SlideSerializer(slide, data=request.data) if serializer.is_valid(): serializer.save() @@ -330,7 +359,7 @@ except Slide.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) - if (slide.book.idArticle): + if (slide.book.id_article): return Response(status=status.HTTP_403_FORBIDDEN) slide.delete() diff -r 41a78460bdac -r ea633c8f9bfa server/src/authentication/migrations/0001_initial.py --- a/server/src/authentication/migrations/0001_initial.py Fri Jun 05 16:10:12 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -from django.conf import settings -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='AmmicoUser', - fields=[ - ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(default=django.utils.timezone.now, verbose_name='last login')), - ('email', models.EmailField(max_length=255, unique=True, verbose_name='email address')), - ('idUser', models.IntegerField(verbose_name='identifiant utilisateur', null=True, blank=True)), - ('is_active', models.BooleanField(default=True)), - ('is_admin', models.BooleanField(default=False)), - ], - options={ - 'abstract': False, - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='Profile', - fields=[ - ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), - ('image', models.URLField(max_length=2048, blank=True)), - ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), - ], - options={ - }, - bases=(models.Model,), - ), - ] diff -r 41a78460bdac -r ea633c8f9bfa server/src/authentication/models.py --- a/server/src/authentication/models.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/authentication/models.py Tue Jun 09 19:05:05 2015 +0200 @@ -5,7 +5,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -import settings +from django.conf import settings class AmmicoUserManager(BaseUserManager): diff -r 41a78460bdac -r ea633c8f9bfa server/src/authentication/urls.py --- a/server/src/authentication/urls.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/authentication/urls.py Tue Jun 09 19:05:05 2015 +0200 @@ -1,7 +1,6 @@ from django.conf.urls import patterns, url -from rest_framework.authtoken import views -from authentication.views import User, ObtainAuthToken +from .views import User, ObtainAuthToken urlpatterns = patterns('', diff -r 41a78460bdac -r ea633c8f9bfa server/src/authentication/views.py --- a/server/src/authentication/views.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/authentication/views.py Tue Jun 09 19:05:05 2015 +0200 @@ -8,10 +8,11 @@ from rest_framework.response import Response from rest_framework.views import APIView +from config import URL_JAMESPOT from ammico.views import populateVisit -from config import URL_JAMESPOT +#from ammico.views import populateVisit class UserSerializer(serializers.ModelSerializer): class Meta: model = get_user_model() @@ -54,7 +55,7 @@ def post(self, request): user = get_user_model().objects.get(email = request.data['email'], password = request.data['password']) - if (user.idUser): - populateVisit(user) + if (user.idUser and 'idExpo' in request.GET): + populateVisit(user, request.GET['idExpo']); token, _ = Token.objects.get_or_create(user=user) return Response({'token': token.key}) \ No newline at end of file diff -r 41a78460bdac -r ea633c8f9bfa server/src/urls.py --- a/server/src/urls.py Fri Jun 05 16:10:12 2015 +0200 +++ b/server/src/urls.py Tue Jun 09 19:05:05 2015 +0200 @@ -5,5 +5,5 @@ urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), - url(r'^ammico/', include('ammico.urls')), + url(r'^ammico/', include('ammico.urls', namespace='ammico')), ) \ No newline at end of file