Skip to content
Snippets Groups Projects
Commit 76651bc7 authored by Samuel GAIST's avatar Samuel GAIST
Browse files

[databases] Implement accessibility dates

parent db7a68d9
No related branches found
No related tags found
1 merge request!319Add usage time to database
# -*- coding: utf-8 -*-
# Generated by Django 1.11.25 on 2020-02-12 11:22
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("databases", "0006_databaseset_hash_unique")]
operations = [
migrations.AddField(
model_name="database",
name="accessibility_start_date",
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name="database",
name="accessibility_end_date",
field=models.DateTimeField(blank=True, null=True),
),
]
......@@ -29,9 +29,12 @@ import os
import simplejson
from datetime import datetime
from django.db import models
from django.conf import settings
from django.core.urlresolvers import reverse
from django.db.models import Q
import beat.core.database
from beat.backend.python.hash import hashDataset
......@@ -89,6 +92,13 @@ class DatabaseStorage(OverwriteStorage):
# ----------------------------------------------------------
def _filter_accessibility_date(queryset):
now = datetime.now()
return queryset.filter(
(Q(accessibility_start_date=None) | Q(accessibility_start_date__lte=now))
& (Q(accessibility_end_date=None) | Q(accessibility_end_date__gte=now))
)
class DatabaseManager(VersionableManager):
......@@ -96,6 +106,14 @@ class DatabaseManager(VersionableManager):
return self.get(name=name, version=version)
def for_user(self, user, add_public=False):
original_query = super(DatabaseManager, self).for_user(user, add_public)
return _filter_accessibility_date(original_query)
def public(self):
original_query = super(DatabaseManager, self).public()
return _filter_accessibility_date(original_query)
def create_database(
self,
name,
......@@ -167,6 +185,9 @@ class Database(Versionable):
# _____ Fields __________
accessibility_start_date = models.DateTimeField(blank=True, null=True)
accessibility_end_date = models.DateTimeField(blank=True, null=True)
declaration_file = models.FileField(
storage=DatabaseStorage(),
upload_to=get_contribution_declaration_filename,
......@@ -213,6 +234,50 @@ class Database(Versionable):
# _____ Overrides __________
def accessibility_for(self, user_or_team, without_usable=False):
now = datetime.now()
accessible = True
if self.accessibility_start_date and self.accessibility_end_date:
if now < self.accessibility_start_date or now > self.accessibility_end_date:
accessible = False
elif self.accessibility_start_date:
if now < self.accessibility_start_date:
accessible = False
elif self.accessibility_end_date:
if now > self.accessibility_end_date:
accessible = False
if not accessible:
return (False, False, None)
return super(Database, self).accessibility_for(user_or_team, without_usable)
def is_accessible(self, users=None, teams=None):
errors = []
now = datetime.now()
if self.accessibility_start_date and self.accessibility_end_date:
if now < self.accessibility_start_date or now > self.accessibility_end_date:
errors.append(
"The database {} is currently not accessible".format(self.fullname)
)
elif self.accessibility_start_date:
if now < self.accessibility_start_date:
errors.append(
"The database {} is not yet accessible".format(self.fullname)
)
elif self.accessibility_end_date:
if now > self.accessibility_end_date:
errors.append(
"The database {} is not accessible anymore".format(self.fullname)
)
if errors:
return errors
return super(Database, self).is_accessible(users, teams)
def save(self, *args, **kwargs):
# load database descriptor declaration
......
......@@ -27,6 +27,8 @@
import json
from datetime import datetime, timedelta
from django.contrib.auth.models import User
from django.conf import settings
from django.core.urlresolvers import reverse
......@@ -39,7 +41,7 @@ from ..common.testutils import BaseTestCase
from ..common.testutils import tearDownModule # noqa test runner will call it
TEST_PWD = "1234"
TEST_PWD = "1234" # nosec
class DatabaseAPIBase(BaseTestCase):
......@@ -128,18 +130,57 @@ class DatabaseCreationAPI(DatabaseAPIBase):
class DatabaseRetrievalAPI(DatabaseAPIBase):
def test_retrieve_database(self):
def setUp(self):
super(DatabaseRetrievalAPI, self).setUp()
(dataformat, errors) = DataFormat.objects.create_dataformat(
self.system_user, "float", ""
)
self.assertIsNotNone(dataformat, errors)
dataformat.share()
(database, errors) = Database.objects.create_database(
(self.database, errors) = Database.objects.create_database(
self.db_name, declaration=self.DATABASE
)
self.assertIsNotNone(database, errors)
database.share()
self.assertIsNotNone(self.database, errors)
def tearDown(self):
self.database.delete()
def __accessibility_test(self):
self.database.accessibility_start_date = datetime.now()
self.database.accessibility_end_date = (
self.database.accessibility_start_date + timedelta(days=1)
)
self.database.save()
object_url = reverse(
"api_databases:object", kwargs={"database_name": self.db_name, "version": 1}
)
all_url = reverse("api_databases:all")
response = self.client.get(object_url, format="json")
self.checkResponse(response, 200, content_type="application/json")
response = self.client.get(all_url, format="json")
self.checkResponse(response, 200, content_type="application/json")
self.assertEqual(len(response.json()), 1)
self.database.accessibility_start_date = datetime.now() - timedelta(days=2)
self.database.accessibility_end_date = (
self.database.accessibility_start_date + timedelta(days=1)
)
self.database.save()
response = self.client.get(object_url, format="json")
self.checkResponse(response, 404)
response = self.client.get(all_url, format="json")
self.checkResponse(response, 200, content_type="application/json")
self.assertEqual(len(response.json()), 0)
def test_retrieve_database(self):
self.database.share()
self.client.login(username=settings.SYSTEM_ACCOUNT, password=TEST_PWD)
......@@ -153,4 +194,13 @@ class DatabaseRetrievalAPI(DatabaseAPIBase):
declaration = json.loads(data["declaration"])
self.assertTrue(declaration["root_folder"].startswith("/path_to_db_folder"))
database.delete()
def test_dated_database_for_user(self):
self.database.share(users=[settings.SYSTEM_ACCOUNT])
self.database.save()
self.client.login(username=settings.SYSTEM_ACCOUNT, password=TEST_PWD)
self.__accessibility_test()
def test_dated_database_for_public(self):
self.database.share()
self.database.save()
self.__accessibility_test()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment