Skip to content

Commit

Permalink
Oznaczanie rekordów w zewnętrznych bazach danych
Browse files Browse the repository at this point in the history
Framework umożliwiający dopisywanie dowolnych zewnętrznych baz danych i tagowanie rekordów, które w nich są, z opcjonalną informacją. Obecnie zaimplementowany dla wydawnictw ciągłych.

Uwaga: oznaczanie konferencji w bazach Scopus/WOS pozostaje bez zmian. W sytuacji, gdyby dla konferencji potrzebny był większy zakres baz danych (podytkowany wytycznymi PBN), warto by było również dla konferencji zaimplementować takie „tagowanie”. Na ten moment konferencje pozostają tj są.
  • Loading branch information
mpasternak committed Apr 16, 2018
1 parent a0888e4 commit 4827b67
Show file tree
Hide file tree
Showing 18 changed files with 280 additions and 28 deletions.
7 changes: 6 additions & 1 deletion src/bpp/admin/__init__.py
Expand Up @@ -5,7 +5,7 @@
QuerySetSequenceSelect2
from queryset_sequence import QuerySetSequence

from bpp.models import Rodzaj_Prawa_Patentowego
from bpp.models import Rodzaj_Prawa_Patentowego, Zewnetrzna_Baza_Danych
from .core import RestrictDeletionToAdministracjaGroupAdmin, \
RestrictDeletionToAdministracjaGroupMixin
from ..models.nagroda import OrganPrzyznajacyNagrody
Expand Down Expand Up @@ -68,6 +68,11 @@ class JezykAdmin(RestrictDeletionToAdministracjaGroupAdmin):
RestrictDeletionToAdministracjaGroupAdmin)


@admin.register(Zewnetrzna_Baza_Danych)
class Zewnetrzna_Baza_DanychAdmin(RestrictDeletionToAdministracjaGroupAdmin, CommitedModelAdmin):
list_display = ['nazwa', 'skrot']


class Charakter_PBNAdmin(RestrictDeletionToAdministracjaGroupMixin,
CommitedModelAdmin):
list_display = ['identyfikator', 'wlasciwy_dla', 'opis',
Expand Down
2 changes: 1 addition & 1 deletion src/bpp/admin/nagroda.py
Expand Up @@ -25,5 +25,5 @@ class Meta:

class NagrodaInline(GenericTabularInline):
model = Nagroda
extra = 0
extra = 1
form = NagrodaForm
23 changes: 17 additions & 6 deletions src/bpp/admin/wydawnictwo_ciagle.py
@@ -1,15 +1,14 @@
# -*- encoding: utf-8 -*-

from dal import autocomplete
from django import forms
from django.contrib import admin
from django.forms.utils import flatatt
from django.utils.safestring import mark_safe

from bpp.admin.filters import LiczbaZnakowFilter
from bpp.admin.helpers import *
from bpp.admin.nagroda import NagrodaInline
from bpp.models import Zrodlo, Wydawnictwo_Ciagle # Publikacja_Habilitacyjna
from bpp.models import Zrodlo, Wydawnictwo_Ciagle, Wydawnictwo_Ciagle_Zewnetrzna_Baza_Danych # Publikacja_Habilitacyjna
# Proste tabele
from bpp.models.konferencja import Konferencja
from bpp.models.wydawnictwo_ciagle import Wydawnictwo_Ciagle_Autor
Expand All @@ -33,7 +32,7 @@ def render(self, name, value, attrs=None):
final_attrs = self.build_attrs(
self.attrs,
dict(type="button",
name=name))
name=name))

return mark_safe('<input type="button"%s value="%s" />' % (
flatatt(final_attrs),
Expand Down Expand Up @@ -78,6 +77,17 @@ class Meta:
}


class Wydawnictwo_Ciagle_Zewnetrzna_Baza_DanychForm(forms.ModelForm):
class Meta:
fields = ["baza", "info"]


class Wydawnictwo_Ciagle_Zewnetrzna_Baza_DanychInline(admin.TabularInline):
model = Wydawnictwo_Ciagle_Zewnetrzna_Baza_Danych
extra = 1
form = Wydawnictwo_Ciagle_Zewnetrzna_Baza_DanychForm


class Wydawnictwo_CiagleAdmin(KolumnyZeSkrotamiMixin,
AdnotacjeZDatamiOrazPBNMixin,
CommitedModelAdmin):
Expand All @@ -100,10 +110,10 @@ class Wydawnictwo_CiagleAdmin(KolumnyZeSkrotamiMixin,
'slowa_kluczowe', 'rok', 'id',
'issn', 'e_issn', 'zrodlo__nazwa', 'zrodlo__skrot', 'adnotacje',
'liczba_znakow_wydawniczych',
'konferencja__nazwa'
'konferencja__nazwa',
]

list_filter = ['status_korekty', 'recenzowana', 'typ_kbn',
list_filter = ['status_korekty', 'recenzowana', 'typ_kbn',
'charakter_formalny', 'jezyk', LiczbaZnakowFilter, 'rok',
'openaccess_tryb_dostepu',
'openaccess_wersja_tekstu',
Expand Down Expand Up @@ -131,7 +141,8 @@ class Wydawnictwo_CiagleAdmin(KolumnyZeSkrotamiMixin,

inlines = (
generuj_inline_dla_autorow(Wydawnictwo_Ciagle_Autor),
NagrodaInline
NagrodaInline,
Wydawnictwo_Ciagle_Zewnetrzna_Baza_DanychInline
)

def zrodlo_col(self, obj):
Expand Down
60 changes: 60 additions & 0 deletions src/bpp/migrations/0126_zewnetrzna_baza_danych.py
@@ -0,0 +1,60 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.12 on 2018-04-16 08:51
from __future__ import unicode_literals

import django.db.models.deletion
from django.db import migrations, models


def domyslne_bazy(apps, schema_editor):
Zewnetrzna_Baza_Danych = apps.get_model("bpp", "Zewnetrzna_Baza_Danych")
for nazwa, skrot in [
("Web of Science", "WOS"),
("Scopus", "SCOPUS")]:
Zewnetrzna_Baza_Danych.objects.create(
nazwa=nazwa, skrot=skrot
)


class Migration(migrations.Migration):
dependencies = [
('bpp', '0125_auto_20180415_2223'),
]

operations = [
migrations.CreateModel(
name='Wydawnictwo_Ciagle_Zewnetrzna_Baza_Danych',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('info', models.CharField(blank=True, max_length=512, null=True)),
],
),
migrations.CreateModel(
name='Zewnetrzna_Baza_Danych',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nazwa', models.CharField(max_length=512, unique=True)),
('skrot', models.CharField(max_length=128, unique=True)),
],
options={
'verbose_name': 'zewnętrzna baza danych',
'verbose_name_plural': 'zenwętrzne bazy danych',
'ordering': ['nazwa'],
},
),
migrations.AddField(
model_name='wydawnictwo_ciagle_zewnetrzna_baza_danych',
name='baza',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bpp.Zewnetrzna_Baza_Danych'),
),
migrations.AddField(
model_name='wydawnictwo_ciagle_zewnetrzna_baza_danych',
name='rekord',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bpp.Wydawnictwo_Ciagle'),
),

migrations.RunPython(
domyslne_bazy,
migrations.RunPython.noop
)
]
24 changes: 24 additions & 0 deletions src/bpp/migrations/0127_auto_20180416_1303.py
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.12 on 2018-04-16 11:03
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('bpp', '0126_zewnetrzna_baza_danych'),
]

operations = [
migrations.AlterModelOptions(
name='wydawnictwo_ciagle_zewnetrzna_baza_danych',
options={'verbose_name': 'powiązanie wydawnictwa ciągłego z zewnętrznymi bazami danych', 'verbose_name_plural': 'powiązania wydawnictw ciągłych z zewnętrznymi bazami danych'},
),
migrations.AlterField(
model_name='wydawnictwo_ciagle_zewnetrzna_baza_danych',
name='info',
field=models.CharField(blank=True, max_length=512, null=True, verbose_name='Informacje dodatkowe'),
),
]
20 changes: 20 additions & 0 deletions src/bpp/migrations/0128_zewnetrzne_bazy_view.py
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.12 on 2018-04-16 11:03
from __future__ import unicode_literals

from django.db import migrations

from bpp.migration_util import load_custom_sql


class Migration(migrations.Migration):

dependencies = [
('bpp', '0127_auto_20180416_1303'),
]

operations = [
migrations.RunPython(
lambda *args, **kw: load_custom_sql("0128_zewnetrzne_bazy_view", *args, **kw)
),
]
25 changes: 25 additions & 0 deletions src/bpp/migrations/0128_zewnetrzne_bazy_view.sql
@@ -0,0 +1,25 @@
BEGIN;

CREATE OR REPLACE VIEW bpp_zewnetrzne_bazy_wydawnictwo_ciagle_view AS
SELECT
ARRAY [
(SELECT id
FROM django_content_type
WHERE
django_content_type.app_label = 'bpp' AND
django_content_type.model = 'wydawnictwo_ciagle'),
bpp_wydawnictwo_ciagle_zewnetrzna_baza_danych.rekord_id
] :: INTEGER [2] AS rekord_id,

baza_id,
INFO

FROM bpp_wydawnictwo_ciagle_zewnetrzna_baza_danych;


CREATE OR REPLACE VIEW bpp_zewnetrzne_bazy_view AS

SELECT *
FROM bpp_zewnetrzne_bazy_wydawnictwo_ciagle_view;

COMMIT;
26 changes: 26 additions & 0 deletions src/bpp/migrations/0129_zewnetrznebazydanychview.py
@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.12 on 2018-04-16 11:13
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('bpp', '0128_zewnetrzne_bazy_view'),
]

operations = [
migrations.CreateModel(
name='ZewnetrzneBazyDanychView',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('info', models.TextField()),
],
options={
'db_table': 'bpp_zewnetrzne_bazy_view',
'managed': False,
},
),
]
35 changes: 30 additions & 5 deletions src/bpp/models/cache.py
Expand Up @@ -102,8 +102,8 @@ def zrodlo_pre_save(instance, *args, **kw):
except Zrodlo.DoesNotExist:
return

if old.skrot != instance.skrot: # sprawdz skrot, bo on idzie do opisu
instance._BPP_CHANGED_FIELDS = ['skrot',]
if old.skrot != instance.skrot: # sprawdz skrot, bo on idzie do opisu
instance._BPP_CHANGED_FIELDS = ['skrot', ]


def zrodlo_post_save(instance, *args, **kw):
Expand All @@ -118,10 +118,12 @@ def zrodlo_post_save(instance, *args, **kw):
from bpp.tasks import zaktualizuj_zrodlo
zaktualizuj_zrodlo.delay(instance.pk)


def zrodlo_pre_delete(instance, *args, **kw):
# TODO: moze byc memory-consuming, lepiej byloby to wrzucic do bazy danych - moze?
instance._PRACE = list(Rekord.objects.filter(zrodlo__id=instance.pk).values_list("id", flat=True))


def zrodlo_post_delete(instance, *args, **kw):
for pk in instance._PRACE:
try:
Expand All @@ -131,17 +133,20 @@ def zrodlo_post_delete(instance, *args, **kw):
defer_zaktualizuj_opis(rekord.original)

pass


_CACHE_ENABLED = False


class AlreadyEnabledException(Exception):
pass


class AlreadyDisabledException(Exception):
pass


def enable():

global _CACHE_ENABLED

if _CACHE_ENABLED: raise AlreadyEnabledException()
Expand All @@ -160,6 +165,7 @@ def enable():

_CACHE_ENABLED = True


def disable():
global _CACHE_ENABLED

Expand Down Expand Up @@ -257,6 +263,24 @@ class Meta:
db_table = 'bpp_autorzy'


class ZewnetrzneBazyDanychView(models.Model):
rekord = models.ForeignKey(
'bpp.Rekord',
related_name='zewnetrzne_bazy',
on_delete=DO_NOTHING)

baza = models.ForeignKey(
'bpp.Zewnetrzna_Baza_Danych',
on_delete=DO_NOTHING
)

info = models.TextField()

class Meta:
managed = False
db_table = "bpp_zewnetrzne_bazy_view"


class RekordManager(FulltextSearchMixin, models.Manager):
fts_field = 'search_index'

Expand Down Expand Up @@ -367,7 +391,7 @@ class RekordBase(ModelPunktowanyBaza, ModelZOpisemBibliograficznym,
objects = RekordManager()

strony = None
nr_zeszytu = None
nr_zeszytu = None
tom = None

# Skróty dla django-dsl
Expand Down Expand Up @@ -419,6 +443,7 @@ class Meta:

def with_cache(fun):
"""Użyj jako dekorator do funkcji testujących"""

def _wrapped(*args, **kw):
enable_failure = None
try:
Expand All @@ -432,4 +457,4 @@ def _wrapped(*args, **kw):
else:
raise Exception("Enable failure, trace enable function, there was a bug there...")

return _wrapped
return _wrapped
2 changes: 1 addition & 1 deletion src/bpp/models/konferencja.py
Expand Up @@ -99,4 +99,4 @@ def eksport_pbn_serializuj(self, tagname='conference'):
panstwo = SubElement(element, "country")
panstwo.text = self.panstwo

return element
return element
14 changes: 11 additions & 3 deletions src/bpp/models/system.py
Expand Up @@ -7,8 +7,8 @@
from django.db import models
from django.utils import six

from bpp.models.abstract import ModelZNazwa, NazwaISkrot
from bpp.models import const
from bpp.models.abstract import ModelZNazwa, NazwaISkrot

NAZWY_PRIMO = [
"",
Expand Down Expand Up @@ -120,7 +120,7 @@ class Typ_Odpowiedzialnosci(NazwaISkrot):
""",
db_index=True
)

class Meta:
verbose_name = 'typ odpowiedzialności'
verbose_name_plural = 'typy odpowiedzialności'
Expand Down Expand Up @@ -177,4 +177,12 @@ class Meta:
verbose_name = "rodzaj prawa patentowego"
verbose_name_plural = "rodzaje praw patentowych"
ordering = ['nazwa',]
app_label = 'bpp'
app_label = 'bpp'


class Zewnetrzna_Baza_Danych(NazwaISkrot):
class Meta:
verbose_name = "zewnętrzna baza danych"
verbose_name_plural = "zenwętrzne bazy danych"
ordering = ['nazwa', ]
app_label = 'bpp'

0 comments on commit 4827b67

Please sign in to comment.