add exposition table and update the views to include the new foreign key to the exposition table
authorrougeronj
Tue, 09 Jun 2015 19:05:05 +0200
changeset 143 ea633c8f9bfa
parent 117 41a78460bdac
child 144 f511255cda6e
add exposition table and update the views to include the new foreign key to the exposition table
server/src/ammico/admin.py
server/src/ammico/migrations/0001_initial.py
server/src/ammico/models.py
server/src/ammico/serializers/ammico.py
server/src/ammico/serializers/extractors.py
server/src/ammico/urls.py
server/src/ammico/views.py
server/src/authentication/migrations/0001_initial.py
server/src/authentication/models.py
server/src/authentication/urls.py
server/src/authentication/views.py
server/src/urls.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
--- 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',
-        ),
-    ]
--- 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
--- 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
--- 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()
         
--- 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<idBook>[0-9]+)$', InfoBook.as_view()),
-    url(r'^books/(?P<idBook>[0-9]+)/order$', SlidesOrder.as_view()),
-    url(r'^public', PublicBooks.as_view()),
-    url(r'^slides$', ListSlides.as_view()),
-    url(r'^slides/(?P<idSlide>[0-9]+)$', InfoSlide.as_view()),
-    url(r'^auth/', include('authentication.urls')),
+                       
+    url(r'^(?P<idExpo>[0-9]*)$', AmmicoView.as_view(), name='index'),
+    url(r'^books$', ListBooks.as_view(), name='books'),
+    url(r'^books/(?P<idBook>[0-9]+)$', InfoBook.as_view(), name='book'),
+    url(r'^books/(?P<idBook>[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<idSlide>[0-9]+)$', InfoSlide.as_view(), name='slide'),
+    url(r'^auth/', include('authentication.urls', namespace="authentication")),
+    
+    url(r'^$', api_root, name='api-root'),
 )
--- 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()
--- 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,),
-        ),
-    ]
--- 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):
--- 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('',
--- 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
--- 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