Skip to content

Commit 53897d5

Browse files
committed
add translations for files
1 parent 0f345a5 commit 53897d5

File tree

9 files changed

+74
-19
lines changed

9 files changed

+74
-19
lines changed

amnesia_multilingual/builders.py

+7-10
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
from sqlalchemy import orm
99
from sqlalchemy import sql
10-
from sqlalchemy import event
1110
from sqlalchemy.types import String
1211
from sqlalchemy.orm.collections import attribute_mapped_collection
1312
from sqlalchemy.ext.hybrid import hybrid_property
@@ -73,7 +72,6 @@ def setup_relationships(content_cls, translation_cls,
7372
innerjoin=True,
7473
viewonly=True,
7574
bake_queries=False,
76-
#back_populates='content'
7775
),
7876

7977
'translations': orm.relationship(
@@ -96,27 +94,26 @@ def setup_relationships(content_cls, translation_cls,
9694
),
9795
})
9896

99-
10097
def setup_hybrids(cls, name, translation_cls,
101-
current_locale=get_current_locale):
98+
current_locale=get_current_locale, default=None):
10299

103100
def _fget(self):
104-
return getattr(self.current_translation, name, None)
101+
return getattr(self.current_translation, name, default)
105102

106103
def _fset(self, value):
107104
locale_name = current_locale()
108105

109106
trans = self.translations.setdefault(
110-
locale_name, translation_cls(language_id=locale_name)
107+
locale_name,
108+
translation_cls(language_id=locale_name)
111109
)
112110

113111
setattr(trans, name, value)
114112

115113
def _expr(_cls):
116-
return _cls.translations
117-
118-
hprop = hybrid_property(fget=_fget, fset=_fset, expr=_expr)
114+
return _cls.current_translation
119115

120116
log.info('Adding hybrid attribute: %s.%s', cls, name)
121117

122-
setattr(cls, name, hprop)
118+
setattr(cls, name, hybrid_property(fget=_fget, fset=_fset, expr=_expr))
119+

amnesia_multilingual/modules/document/config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ def includeme(config):
1010

1111
config.set_translatable_mapping(Document, DocumentTranslation)
1212
config.set_translatable_attrs(Document, ('title', 'description', 'body',
13-
'fts' ))
13+
'fts'))

amnesia_multilingual/modules/document/mapper.py

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from amnesia.modules.content_type.utils import get_type_id
88
from amnesia.modules.document import Document
9+
from amnesia.modules.language import Language
910
from amnesia_multilingual.modules.content import ContentTranslation
1011
from amnesia_multilingual.modules.document import DocumentTranslation
1112

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# -*- coding: utf-8 -*-
22

3+
from webob.compat import cgi_FieldStorage
4+
35
from amnesia.modules.file import File
6+
from amnesia.modules.file.events import FileUpdated
47
from amnesia_multilingual.modules.file import FileTranslation
58

69

@@ -9,4 +12,18 @@ def includeme(config):
912
config.include('.mapper')
1013

1114
config.set_translatable_mapping(File, FileTranslation)
12-
config.set_translatable_attrs(File, ('title', 'description', 'fts'))
15+
config.set_translatable_attrs(File, ('title', 'description', 'fts',
16+
'original_name', 'file_size',
17+
'path_name', 'mime_id'))
18+
config.add_subscriber(handle_path_name, FileUpdated)
19+
20+
21+
def handle_path_name(event):
22+
current_locale = event.request.locale_name
23+
entity_locale = event.entity.current_translation.language_id
24+
25+
from sqlalchemy import orm
26+
27+
if entity_locale != current_locale:
28+
session = orm.object_session(event.entity)
29+
session.expire(event.entity, ['current_translation'])

amnesia_multilingual/modules/file/mapper.py

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11

22
# -*- coding: utf-8 -*-
33

4+
import logging
5+
46
from sqlalchemy import orm
7+
from sqlalchemy.ext.associationproxy import association_proxy
58

69
from amnesia.modules.content_type.utils import get_type_id
710
from amnesia.modules.file import File
11+
from amnesia.modules.mime import Mime
812
from amnesia_multilingual.modules.content import ContentTranslation
913
from amnesia_multilingual.modules.file import FileTranslation
1014

15+
log = logging.getLogger(__name__)
16+
1117

1218
def includeme(config):
1319
tables = config.registry['metadata'].tables
@@ -17,12 +23,19 @@ def includeme(config):
1723

1824
orm.mapper(
1925
FileTranslation,
20-
tables['amnesia_multilingual.content_translation'],
26+
tables['amnesia_multilingual.data_translation'],
2127
inherits=ContentTranslation,
2228
polymorphic_identity=get_type_id(config, 'file'),
2329
properties={
2430
'content': orm.relationship(
2531
File, innerjoin=True, uselist=False
32+
),
33+
34+
'mime': orm.relationship(
35+
Mime, lazy='joined'
2636
)
2737
}
2838
)
39+
40+
File.mime = association_proxy('current_translation', 'mime')
41+
#File.mime_id = association_proxy('current_translation', 'mime_id')

amnesia_multilingual/scripts/sql/add_translations.sql

+28
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,28 @@ create table amnesia_multilingual.event_translation (
5252
foreign key(content_id) references event(content_id)
5353
);
5454

55+
create table amnesia_multilingual.data_translation (
56+
language_id char(2) not null,
57+
content_id integer not null,
58+
mime_id integer not null,
59+
original_name text not null,
60+
file_size real not null,
61+
path_name serial not null,
62+
63+
constraint pk_data_translation
64+
primary key(language_id, content_id),
65+
66+
constraint fk_data_translation_content_translation
67+
foreign key(language_id, content_id)
68+
references amnesia_multilingual.content_translation(language_id, content_id),
69+
70+
constraint fk_data_translation_data
71+
foreign key(content_id) references data(content_id),
72+
73+
constraint fk_data_translation_mime
74+
foreign key(mime_id) references mime(id) deferrable initially deferred
75+
);
76+
5577
insert into amnesia_multilingual.content_translation(language_id, content_id, title, description)
5678
select 'en', id as content_id, title, description from content;
5779

@@ -64,3 +86,9 @@ alter table document drop column body;
6486

6587
insert into amnesia_multilingual.event_translation select 'en', content_id, body from event;
6688
alter table event drop column body;
89+
90+
insert into amnesia_multilingual.data_translation select 'en', content_id, mime_id, original_name, file_size, path_name from data;
91+
alter table data drop column original_name;
92+
alter table data drop column file_size;
93+
alter table data drop column path_name;
94+
alter table data drop column mime_id;

amnesia_multilingual/tweens.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,4 @@ def __call__(self, request):
2929

3030
request._LOCALE_ = lang
3131

32-
response = self.handler(request)
33-
34-
return response
32+
return self.handler(request)

docs/index.rst

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ Content-based content types in AmnesiaCMS.
1111
How does it work?
1212
=================
1313

14-
Multilingual support for each Content-based content type will be stored in a
15-
dedicated translation table.
14+
Entities which contain translatable fields are splitted. Non-translatable
15+
fields remain in the base entity table while translatable fields go in a
16+
dedicated table.
1617

1718
=====
1819
Usage

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3-
__version__ = '0.0.1.dev3'
3+
__version__ = '0.0.2+dev'
44

55
import os
66

0 commit comments

Comments
 (0)