Skip to content

Commit 842685b

Browse files
committed
Legimi export, and some upgrades.
1 parent 21ae6d5 commit 842685b

File tree

8 files changed

+267
-27
lines changed

8 files changed

+267
-27
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ requirements.pybundle
44
*~
55
*.swp
66
.*.orig
7+
*#
78
/redakcja/media
89
/static
910
.sass-cache

requirements/requirements.txt

+8-9
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,19 @@ Wikidata==0.6.1
1313
librarian==2.3.4
1414

1515
## Django
16-
Django==3.1.13
16+
Django==3.2.12
1717
fnpdjango==0.5
18-
django-pipeline==2.0.5
19-
django-cas-ng==4.2.1
20-
sorl-thumbnail==12.7.0
21-
django-maintenancemode>=0.9
18+
django-pipeline==2.0.7
19+
django-cas-ng==4.3.0
20+
sorl-thumbnail==12.8.0
2221
fnp-django-pagination==2.2.4
2322
django-gravatar2==1.4.4
2423
django-extensions==3.1.3
2524
django-bootstrap4==3.0.1
26-
libsasscompiler==0.1.8
27-
django-debug-toolbar==3.2.1
25+
libsasscompiler==0.1.9
26+
django-debug-toolbar==3.2.4
2827
django-admin-numeric-filter==0.1.6
29-
djangorestframework==3.12.4
30-
django-filter==2.4.0
28+
djangorestframework==3.13.1
29+
django-filter==21.1
3130

3231
sentry-sdk==0.12.2

src/depot/legimi.py

+235
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
from datetime import date
2+
import re
3+
from django.conf import settings
4+
from librarian.functions import lang_code_3to2
5+
from librarian.html import transform_abstrakt
6+
from librarian.builders import EpubBuilder, MobiBuilder
7+
from librarian.cover import LegimiCornerCover, LegimiCover
8+
import requests
9+
10+
11+
12+
fundraising=[
13+
"Książka, którą czytasz, pochodzi z <a href=\"https://wolnelektury.pl/\">Wolnych Lektur</a>. Naszą misją jest wspieranie dzieciaków w dostępie do lektur szkolnych oraz zachęcanie ich do czytania. Miło Cię poznać!",
14+
"Podoba Ci się to, co robimy? Jesteśmy organizacją pożytku publicznego. Wesprzyj Wolne Lektury drobną wpłatą: <a href=\"https://wolnelektury.pl/towarzystwo/\">wolnelektury.pl/towarzystwo/</a>",
15+
"Przyjaciele Wolnych Lektur otrzymują dostęp do prapremier wcześniej niż inni. Zadeklaruj stałą wpłatę i dołącz do Towarzystwa Przyjaciół Wolnych Lektur: <a href=\"https://wolnelektury.pl/towarzystwo/\">wolnelektury.pl/towarzystwo/</a>",
16+
"Informacje o nowościach w naszej bibliotece w Twojej skrzynce mailowej? Nic prostszego, zapisz się do newslettera. Kliknij, by pozostawić swój adres e-mail: <a href=\"https://wolnelektury.pl/newsletter/zapisz-sie/\">wolnelektury.pl/newsletter/zapisz-sie/</a>",
17+
"Przekaż 1% podatku na Wolne Lektury.<br/>\nKRS: 0000070056<br/>\nNazwa organizacji: Fundacja Nowoczesna Polska<br/>\nKażda wpłacona kwota zostanie przeznaczona na rozwój Wolnych Lektur."
18+
]
19+
20+
class Legimi:
21+
#BASE_URL = 'https://wydawca.legimi.com'
22+
BASE_URL = 'https://panel.legimi.pl'
23+
LOGIN_URL = BASE_URL + '/publishers/membership'
24+
UPLOAD_URL = BASE_URL + '/administration/upload/start'
25+
CREATE_URL = BASE_URL + '/publishers/publications/create'
26+
EDIT_URL = BASE_URL + '/publishers/publications/edit/%s'
27+
EDIT_FILES_URL = BASE_URL + '/publishers/publications/editfiles/%s'
28+
29+
def __init__(self, username, password, publisher_id):
30+
self.username = username
31+
self.password = password
32+
self.publisher_id = publisher_id
33+
self._session = None
34+
35+
@property
36+
def session(self):
37+
if self._session is None:
38+
session = requests.Session()
39+
response = session.post(
40+
self.LOGIN_URL,
41+
data={
42+
'ValidationTrue': 'true',
43+
'UserName': self.username,
44+
'Password': self.password,
45+
})
46+
self._session = session
47+
return self._session
48+
49+
def list(self):
50+
return self.session.get('https://wydawca.legimi.com/publishers/publications')
51+
52+
def upload(self, content):
53+
response = self.session.post(
54+
self.UPLOAD_URL,
55+
files={
56+
"files": content,
57+
})
58+
model = response.json()['model']
59+
return {
60+
"name": model['Name'],
61+
"token": model['Token'],
62+
"url": model['Url'],
63+
}
64+
65+
# name=files[]
66+
# filename
67+
# content-type
68+
# response: json
69+
# success: true
70+
# model.Url
71+
72+
def send_book(self, book):
73+
wlbook = book.wldocument(librarian2=True)
74+
meta = wlbook.meta
75+
76+
cover = LegimiCornerCover(meta, width=1200).output_file()
77+
epub_file = EpubBuilder(cover=LegimiCover, fundraising=fundraising).build(wlbook).get_file()
78+
mobi_file = MobiBuilder(cover=LegimiCover, fundraising=fundraising).build(wlbook).get_file()
79+
80+
book_data = {
81+
"Title": meta.title,
82+
"Author": ", ".join(p.readable() for p in meta.authors),
83+
"Year": meta.created_at[:4],
84+
85+
'GenreId': '11', # TODO
86+
'Isbn': '',
87+
'LanguageLocale': lang_code_3to2(meta.language),
88+
89+
'Description': '<p>—</p>',
90+
}
91+
if meta.isbn_html:
92+
isbn = meta.isbn_html
93+
if isbn.upper().startswith('ISBN '):
94+
isbn = isbn[5:]
95+
isbn = isbn.strip()
96+
book_data['Isbn'] = isbn
97+
98+
files_data = {}
99+
100+
abstract = wlbook.tree.find('.//abstrakt')
101+
if abstract is not None:
102+
book_data['Description'] = transform_abstrakt(abstract)
103+
104+
105+
cover_data = self.upload(
106+
(meta.url.slug + '.jpg', cover.get_file(), 'image/jpeg')
107+
)
108+
book_data.update({
109+
"Cover.Name": cover_data['name'],
110+
"Cover.Token": cover_data['token'],
111+
"Cover.Url": cover_data['url'],
112+
})
113+
114+
epub_data = self.upload(
115+
(meta.url.slug + '.epub', epub_file, 'application/epub+zip')
116+
)
117+
files_data.update({
118+
'BookEpub.Token': epub_data['token'],
119+
'BookEpub.Name': epub_data['name'],
120+
})
121+
122+
mobi_data = self.upload(
123+
(meta.url.slug + '.mobi', mobi_file, 'application/x-mobipocket-ebook')
124+
)
125+
files_data.update({
126+
'BookMobi.Token': mobi_data['token'],
127+
'BookMobi.Name': mobi_data['name'],
128+
})
129+
130+
if book.legimi_id:
131+
self.edit(
132+
book.legimi_id,
133+
book_data
134+
)
135+
self.edit_files(
136+
book.legimi_id,
137+
files_data
138+
)
139+
else:
140+
legimi_id = self.create_book(book_data, files_data)
141+
if legimi_id:
142+
book.legimi_id = legimi_id
143+
book.save(update_fields=['legimi_id'])
144+
145+
def create_book(self, book_data, files_data):
146+
data = {
147+
'createValidationTrue': 'true',
148+
'PublisherId': self.publisher_id,#3609954
149+
'IsLibraryPass': 'False',
150+
151+
'SamplesGenerationType': 'Quantity',
152+
'SamplesGenerationPercent': '10',
153+
154+
'EnterToTheMarketType': 'No',
155+
'EnterToTheMarketDate': date.today().strftime('%d.%m.%Y'),
156+
'HidingDate': '',
157+
'SalesNoLimitOption': 'false',
158+
'SalesNoLimitKindle': 'false',
159+
'SalesInStoreEbookGrossValue': '0,00',
160+
'SalesPromotion': 'False',
161+
'SalesPromotionGrossValue': '0,00',
162+
'SalesPromotionDatesRange.DateStart': '',
163+
'SalesPromotionDatesRange.DateEnd': '',
164+
}
165+
166+
for form in 'Epub', 'Mobi', 'Pdf':
167+
data.update({
168+
f'Book{form}.Token': '',
169+
f'Book{form}.Name': '',
170+
f'Book{form}.StorageName': '',
171+
f'Book{form}.Order': '',
172+
173+
f'Sample{form}Type': 'Files',
174+
f'Sample{form}.Token': '',
175+
f'Sample{form}.Name': '',
176+
f'Sample{form}.StorageName': '',
177+
f'Sample{form}.Order': '',
178+
})
179+
180+
data.update(book_data)
181+
data.update(files_data)
182+
183+
response = self.session.post(self.CREATE_URL, data=data)
184+
m = re.search(r'/(\d+)$', response.url)
185+
if m is not None:
186+
return m.group(1)
187+
188+
def edit(self, legimi_id, data):
189+
current = {
190+
'ValidationTrue': 'true',
191+
'Is': legimi_id
192+
}
193+
194+
current.update(data)
195+
196+
self.session.post(
197+
self.EDIT_URL % legimi_id,
198+
data=current
199+
)
200+
201+
def edit_files(self, legimi_id, files_data):
202+
current = {
203+
'ValidationTrue': 'true',
204+
'Id': legimi_id,
205+
'SamplesGenerationType': 'Quantity',
206+
'SamplesGenerationPercent': '10',
207+
}
208+
209+
for form in 'Epub', 'Mobi', 'Pdf':
210+
current.update({
211+
f'Book{form}.Token': '',
212+
f'Book{form}.Name': '',
213+
f'Book{form}.StorageName': '',
214+
f'Book{form}.Order': '',
215+
216+
f'Sample{form}.Type': 'Files',
217+
f'Sample{form}.Token': '',
218+
f'Sample{form}.Name': '',
219+
f'Sample{form}.StorageName': '',
220+
f'Sample{form}.Order': '',
221+
})
222+
223+
current.update(files_data)
224+
225+
response = self.session.post(
226+
self.EDIT_FILES_URL % legimi_id,
227+
data=current
228+
)
229+
230+
231+
legimi = Legimi(
232+
settings.LEGIMI_USERNAME,
233+
settings.LEGIMI_PASSWORD,
234+
settings.LEGIMI_PUBLISHER_ID,
235+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.2.12 on 2022-03-15 18:31
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('documents', '0007_book_dc'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='book',
15+
name='legimi_id',
16+
field=models.CharField(blank=True, max_length=255),
17+
),
18+
]

src/documents/models/book.py

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class Book(models.Model):
5252
related_name='document_books',
5353
related_query_name='document_book',
5454
)
55+
legimi_id = models.CharField(max_length=255, blank=True)
5556

5657
class NoTextError(BaseException):
5758
pass

src/redakcja/settings/__init__.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
MIDDLEWARE += [
5454
'django.contrib.admindocs.middleware.XViewMiddleware',
5555
'fnp_django_pagination.middleware.PaginationMiddleware',
56-
'maintenancemode.middleware.MaintenanceModeMiddleware',
5756
]
5857

5958
if DEBUG:
@@ -128,7 +127,7 @@
128127
'CSS_COMPRESSOR': None,
129128
'JS_COMPRESSOR': None,
130129
'COMPILERS': (
131-
'pipeline.compilers.sass.SASSCompiler',
130+
'libsasscompiler.LibSassCompiler',
132131
),
133132

134133
# CSS and JS files to compress
@@ -267,6 +266,9 @@
267266
}
268267

269268

269+
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
270+
271+
270272
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
271273

272274

src/redakcja/settings/defaults.py

-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
DEBUG = False
2020

21-
MAINTENANCE_MODE = False
22-
2321
ADMINS = (
2422
(u'Radek Czajka', '[email protected]'),
2523
)

src/redakcja/templates/503.html

-14
This file was deleted.

0 commit comments

Comments
 (0)