fix migration history

This commit is contained in:
bruks 2026-10-02 09:25:08 +01:00
commit 8bb2d372c2
59 changed files with 4326 additions and 234 deletions

View file

@ -508,3 +508,49 @@ def has_plugin_permission(user, plugin_type, permission_type):
# Grant all permissions for uninstalled plugins, so they do not block
# emptying placeholders.
return True
def has_page_permission(user, page, permission, site=None):
"""
Backwards-compatible wrapper for the legacy django-cms
has_page_permission() API.
Legacy callers pass short permission names such as:
add
change
delete
publish
Modern django-cms uses action names such as:
add_page
change_page
delete_page
publish_page
"""
if not user or not user.is_authenticated:
return False
if user.is_superuser or not get_cms_setting('PERMISSION'):
return True
action_map = {
'add': 'add_page',
'change': 'change_page',
'delete': 'delete_page',
'publish': 'publish_page',
'move': 'move_page',
'view': 'view_page',
'change_advanced_settings': 'change_page_advanced_settings',
'change_permissions': 'change_page_permissions',
}
action = action_map.get(permission, permission)
from .page_permissions import has_generic_permission
return has_generic_permission(
page=page,
user=user,
action=action,
site=site,
)

View file

@ -24,13 +24,13 @@ class CMSIntegration(models.Model):
'fetch the Integration into pages'
)
)
footer_placeholder = PlaceholderRelationField(
footer_placeholder = PlaceholderField(
'datacenterlight_footer', related_name='dcl-footer-placeholder+'
)
navbar_placeholder = PlaceholderRelationField(
navbar_placeholder = PlaceholderField(
'datacenterlight_navbar', related_name='dcl-navbar-placeholder+'
)
calculator_placeholder = PlaceholderRelationField(
calculator_placeholder = PlaceholderField(
'datacenterlight_calculator',
related_name='dcl-calculator-placeholder+'
)

View file

@ -12,6 +12,7 @@ class Migration(migrations.Migration):
dependencies = [
('cms', '0014_auto_20160404_1908'),
('filer', '0001_squashed_0016_alter_folder_index_together_remove_folder_level_and_more'),
('datacenterlight', '0011_auto_20180220_1423'),
]

View file

@ -1,26 +1,63 @@
from cms.models import Page
from cms.utils.i18n import get_language_list
from django.db import migrations
def forwards(apps, schema_editor):
BlogConfig = apps.get_model("djangocms_blog", "BlogConfig")
BlogConfigTranslation = apps.get_model("djangocms_blog", "BlogConfigTranslation")
BlogConfigTranslation = apps.get_model(
"djangocms_blog",
"BlogConfigTranslation"
)
Post = apps.get_model("djangocms_blog", "Post")
BlogCategory = apps.get_model("djangocms_blog", "BlogCategory")
GenericBlogPlugin = apps.get_model("djangocms_blog", "GenericBlogPlugin")
LatestPostsPlugin = apps.get_model("djangocms_blog", "LatestPostsPlugin")
AuthorEntriesPlugin = apps.get_model("djangocms_blog", "AuthorEntriesPlugin")
GenericBlogPlugin = apps.get_model(
"djangocms_blog",
"GenericBlogPlugin"
)
LatestPostsPlugin = apps.get_model(
"djangocms_blog",
"LatestPostsPlugin"
)
AuthorEntriesPlugin = apps.get_model(
"djangocms_blog",
"AuthorEntriesPlugin"
)
config = None
for page in Page.objects.drafts().filter(application_urls="BlogApp"):
config, created = BlogConfig.objects.get_or_create(namespace=page.application_namespace)
for page in Page.objects.filter(application_urls="BlogApp"):
config, created = BlogConfig.objects.get_or_create(
namespace=page.application_namespace
)
if not BlogConfigTranslation.objects.exists():
for lang in get_language_list():
title = page.get_title(lang)
BlogConfigTranslation.objects.create(language_code=lang, master_id=config.pk, app_title=title)
BlogConfigTranslation.objects.create(
language_code=lang,
master_id=config.pk,
app_title=title
)
if config:
for model in (Post, BlogCategory, GenericBlogPlugin, LatestPostsPlugin, AuthorEntriesPlugin):
for model in (
Post,
BlogCategory,
GenericBlogPlugin,
LatestPostsPlugin,
AuthorEntriesPlugin,
):
for item in model.objects.filter(app_config__isnull=True):
item.app_config = config
item.save()
@ -31,6 +68,7 @@ def backwards(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
("cms", "0004_auto_20140924_1038"),
("djangocms_blog", "0013_auto_20160201_2235"),
@ -38,4 +76,4 @@ class Migration(migrations.Migration):
operations = [
migrations.RunPython(forwards, backwards),
]
]

View file

@ -114,14 +114,14 @@ INSTALLED_APPS = (
'aldryn_boilerplates',
'aldryn_categories',
'aldryn_common',
'aldryn_newsblog',
'aldryn_people',
#TODO:'aldryn_newsblog',
#TODO:'aldryn_people',
#TODO: 'aldryn_reversion',
'aldryn_translation_tools',
'treebeard', # utilities for implementing a tree
'sekizai', # for javascript and css management
'menus', # helper for model independent hierarchical website navigation
'cmsplugin_filer_image',
#TODO:'cmsplugin_filer_image',
# 2nd migrate
# django-cms plugins
@ -136,9 +136,9 @@ INSTALLED_APPS = (
# 'djangocms_teaser',
'djangocms_page_meta',
'djangocms_text_ckeditor',
'cmsplugin_filer_file',
'cmsplugin_filer_folder',
'cmsplugin_filer_link',
#TODO:'cmsplugin_filer_file',
#TODO:'cmsplugin_filer_folder',
#TODO:'cmsplugin_filer_link',
# 'cmsplugin_filer_teaser',
#'cmsplugin_filer_video',
#
@ -160,8 +160,10 @@ INSTALLED_APPS = (
'webhook',
'django.contrib.postgres',
'debug_toolbar',
)
MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware',

View file

@ -15,10 +15,10 @@ CACHES = {
}
}
MIDDLEWARE_CLASSES += ("debug_toolbar.middleware.DebugToolbarMiddleware",)
MIDDLEWARE += ("debug_toolbar.middleware.DebugToolbarMiddleware",)
INSTALLED_APPS += (
'django_extensions',
#'django_extensions',
# debug_toolbar seems to conflict with multisite (and djangocms_multisite)
# 'debug_toolbar'
)

View file

@ -1,4 +1,5 @@
from .base import * # flake8: noqa
import os
# List of people that get admin messages
ADMINS = ((x, x + "@ungleich.ch") for x in ["web-team"])
@ -31,5 +32,6 @@ ALLOWED_HOSTS = [
".ipv6onlyhosting.com",
".digitalglarus.ch",
".hack4glarus.ch",
".xn--nglarus-n2a.ch"
".xn--nglarus-n2a.ch",
"127.0.0.1",
]

View file

@ -14,6 +14,6 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterModelOptions(
name='virtualmachineplan',
options={'permissions': (('view_virtualmachineplan', 'View Virtual Machine Plan'), ('cancel_virtualmachineplan', 'Cancel Virtual Machine Plan'))},
options={},
),
]

View file

@ -14,6 +14,6 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterModelOptions(
name='hostingorder',
options={'permissions': (('view_hostingorder', 'View Hosting Order'),)},
options={},
),
]

View file

@ -24,7 +24,7 @@ class Migration(migrations.Migration):
('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='membership.StripeCustomer')),
],
options={
'permissions': (('view_hostingbill', 'View Hosting Bill'),),
},
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
),

View file

@ -29,7 +29,7 @@ class Migration(migrations.Migration):
('stripe_customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='membership.StripeCustomer')),
],
options={
'permissions': (('view_usercarddetail', 'View User Card'),),
},
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
),

View file

@ -35,7 +35,7 @@ class Migration(migrations.Migration):
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hosting.HostingOrder')),
],
options={
'permissions': (('view_monthlyhostingbill', 'View Monthly Hosting'),),
},
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
),

View file

@ -30,7 +30,7 @@ class Migration(migrations.Migration):
('monthly_hosting_bill', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hosting.MonthlyHostingBill')),
],
options={
'permissions': (('view_hostingbilllineitem', 'View Monthly Hosting Bill Line Item'),),
},
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
),

View file

@ -2,6 +2,10 @@
import os
import sys
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(BASE_DIR, "vendor"))
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dynamicweb.settings")

View file

@ -8,6 +8,27 @@ class Migration(migrations.Migration):
operations = [
migrations.RunSQL(
"ALTER TABLE djangocms_blog_authorentriesplugin_authors "
"RENAME COLUMN user_id TO customuser_id;"),
"""
DO $$
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_name = 'djangocms_blog_authorentriesplugin_authors'
AND column_name = 'user_id'
)
AND NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_name = 'djangocms_blog_authorentriesplugin_authors'
AND column_name = 'customuser_id'
)
THEN
ALTER TABLE djangocms_blog_authorentriesplugin_authors
RENAME COLUMN user_id TO customuser_id;
END IF;
END
$$;
""",
),
]

102
old_requirements.txt Normal file
View file

@ -0,0 +1,102 @@
Babel==2.3.4
Django==1.9.4
Django-Select2==4.3.2
Pillow==3.2.0
URLObject==2.4.0
Unidecode==0.04.19
YURL==0.13
aldryn-apphooks-config==0.2.7
aldryn-boilerplates==0.7.4
aldryn-categories==1.0.3
aldryn-common==1.0.1
aldryn-newsblog==1.2.1
aldryn-people==1.2.0
aldryn-reversion==1.0.8
aldryn-search==0.2.11
aldryn-translation-tools==0.2.1
backport-collections==0.1
cmsplugin-filer==1.0.1
django-appconf==1.0.2
django-appdata==0.1.5
django-bootstrap3==7.0.1
django-classy-tags==0.7.2
django-cms==3.2.5
django-compressor==2.0
django-debug-toolbar==1.4
python-dotenv==0.10.3
django-extensions==1.6.7
django-filer==1.2.0
django-filter==0.13.0
django-formtools==1.0
django-guardian==1.4.4
django-haystack==2.4.1
django-meta==1.2
django-meta-mixin==0.3.0
django-model-utils==2.5
django-mptt==0.8.4
django-parler==1.6.3
django-phonenumber-field==1.1.0
django-polymorphic==0.9.2
django-reversion==1.10.2
django-sekizai==0.9.0
django-sortedm2m==1.2.2
django-spurl==0.6.4
django-standard-form==1.1.1
django-stored-messages==1.4.0
django-taggit==0.18.3
django-taggit-autosuggest==0.2.8
django-taggit-templatetags==0.2.5
django-templatetag-sugar==1.0
django-treebeard==4.0.1
djangocms-admin-style==1.1.1
djangocms-apphook-setup==0.1.2
djangocms-blog==0.9.0
djangocms-file==1.0
djangocms-flash==0.3.0
djangocms-googlemap==0.4.0
djangocms-inherit==0.2.1
djangocms-link==1.7.2
djangocms-page-meta==0.5.11
djangocms-picture==1.0.0
djangocms-teaser==0.2.0
djangocms-text-ckeditor==2.9.3
djangocms-video==1.0.0
easy-thumbnails==2.3
html5lib==0.9999999
ldap3==2.6.1
lxml==3.6.0
model-mommy==1.2.6
phonenumbers==7.4.0
phonenumberslite==7.4.0
psycopg2==2.7.3.2
pycryptodome==3.6.6
pylibmc==1.5.1
python-dateutil==2.5.3
python-slugify==1.2.0
pytz==2016.4
rcssmin==1.0.6
requests==2.10.0
rjsmin==1.0.12
six==1.10.0
sqlparse==0.1.19
stripe==2.41.0
wheel==0.29.0
django-admin-honeypot==1.0.0
coverage==4.3.4
git+https://github.com/ungleich/python-oca.git#egg=oca
djangorestframework==3.6.3
flake8==3.3.0
python-memcached==1.58
celery==4.0.2
redis==2.10.5
django-celery-results==1.0.1
kombu==4.1.0
mccabe==0.6.1
pycodestyle==2.3.1
pyflakes==1.5.0
billiard==3.5.0.3
amqp==2.2.1
vine==1.1.4
cdist==5.0.1
git+https://github.com/ungleich/djangocms-multisite.git#egg=djangocms_multisite
pyotp

View file

@ -1,102 +1,105 @@
Babel==2.3.4
Django==1.9.4
Django-Select2==4.3.2
Pillow==3.2.0
URLObject==2.4.0
Unidecode==0.04.19
YURL==0.13
aldryn-apphooks-config==0.2.7
aldryn-boilerplates==0.7.4
aldryn-categories==1.0.3
aldryn-common==1.0.1
aldryn-newsblog==1.2.1
aldryn-people==1.2.0
aldryn-reversion==1.0.8
aldryn-search==0.2.11
aldryn-translation-tools==0.2.1
backport-collections==0.1
cmsplugin-filer==1.0.1
django-appconf==1.0.2
django-appdata==0.1.5
django-bootstrap3==7.0.1
django-classy-tags==0.7.2
django-cms==3.2.5
django-compressor==2.0
django-debug-toolbar==1.4
python-dotenv==0.10.3
django-extensions==1.6.7
django-filer==1.2.0
django-filter==0.13.0
django-formtools==1.0
django-guardian==1.4.4
django-haystack==2.4.1
django-meta==1.2
aldryn-apphooks-config==0.7.0
aldryn-boilerplates==0.8.0
aldryn-categories==1.2.0
aldryn-common==1.0.5
aldryn-newsblog==2.2.1
aldryn-people==2.2.0
aldryn-translation-tools==0.3.0
amqp==5.4.0
asgiref==3.12.1
babel==2.18.0
backport_collections==0.1
billiard==4.3.0
cdist==7.0.0
celery==5.6.3
certifi==2026.7.22
charset-normalizer==3.5.2
click==8.5.0
click-didyoumean==0.3.1
click-plugins==1.1.1.2
click-repl==0.4.0
cmsplugin-filer==1.1.3
Django==6.1.1
django-appconf==1.2.0
django-appdata==0.4.0
django-bootstrap3==26.2
django-classy-tags==0.8.0
django-cms==3.11.11
django-debug-toolbar==8.0.0
django-filer==3.6.0
django-formtools==2.1
django-guardian==3.5.0
django-js-asset==4.2.0
django-meta==2.5.1
django-meta-mixin==0.3.0
django-model-utils==2.5
django-mptt==0.8.4
django-parler==1.6.3
django-phonenumber-field==1.1.0
django-polymorphic==0.9.2
django-reversion==1.10.2
django-sekizai==0.9.0
django-sortedm2m==1.2.2
django-spurl==0.6.4
django-standard-form==1.1.1
django-mptt==0.18.0
django-multisite==1.9.0
django-parler==2.4
django-phonenumber-field==1.3.0
django-polymorphic==4.11.7
django-recaptcha==4.1.0
django-reversion==6.3.0
django-sekizai==0.10.0
django-sortedm2m==4.0.0
django-stored-messages==1.4.0
django-taggit==0.18.3
django-taggit-autosuggest==0.2.8
django-taggit==6.1.0
django-taggit-autosuggest==0.4.2
django-taggit-templatetags==0.2.5
django-templatetag-sugar==1.0
django-treebeard==4.0.1
djangocms-admin-style==1.1.1
djangocms-apphook-setup==0.1.2
djangocms-blog==0.9.0
djangocms-file==1.0
djangocms-flash==0.3.0
djangocms-googlemap==0.4.0
djangocms-inherit==0.2.1
djangocms-link==1.7.2
djangocms-page-meta==0.5.11
djangocms-picture==1.0.0
djangocms-teaser==0.2.0
djangocms-text-ckeditor==2.9.3
djangocms-video==1.0.0
easy-thumbnails==2.3
html5lib==0.9999999
ldap3==2.6.1
lxml==3.6.0
model-mommy==1.2.6
phonenumbers==7.4.0
phonenumberslite==7.4.0
psycopg2==2.7.3.2
pycryptodome==3.6.6
pylibmc==1.5.1
python-dateutil==2.5.3
python-slugify==1.2.0
pytz==2016.4
rcssmin==1.0.6
requests==2.10.0
rjsmin==1.0.12
six==1.10.0
sqlparse==0.1.19
stripe==2.41.0
wheel==0.29.0
django-admin-honeypot==1.0.0
coverage==4.3.4
git+https://github.com/ungleich/python-oca.git#egg=oca
djangorestframework==3.6.3
flake8==3.3.0
python-memcached==1.58
celery==4.0.2
redis==2.10.5
django-celery-results==1.0.1
kombu==4.1.0
mccabe==0.6.1
pycodestyle==2.3.1
pyflakes==1.5.0
billiard==3.5.0.3
amqp==2.2.1
vine==1.1.4
cdist==5.0.1
git+https://github.com/ungleich/djangocms-multisite.git#egg=djangocms_multisite
pyotp
django-treebeard==4.3.1
django_celery_results==2.6.0
django_compressor==4.6.0
djangocms-admin-style==3.3.1
djangocms-apphook-setup==0.5.1
djangocms-attributes-field==4.1.2
djangocms-file==4.0.1
djangocms-multisite==0.3.1
djangocms-page-meta==1.4.5
djangocms-picture==4.1.1
djangocms-text-ckeditor==5.1.7
djangocms-video==3.1.0
djangorestframework==3.18.1
easy-thumbnails==2.10.1
html5lib==1.1
idna==3.20
kombu==5.6.2
ldap3==2.9.1
lxml==6.1.3
lxml_html_clean==0.4.5
oca @ git+https://github.com/ungleich/python-oca.git@9bbda45683736a608c99d5e4bff65e50c93f734f
packaging==26.3
phonenumbers==9.0.40
phonenumberslite==9.0.40
pillow==12.3.0
pluggy==0.13.1
prompt_toolkit==3.0.53
psycopg2==2.9.13
py_svg_hush==0.3.0
pyasn1==0.6.4
pycrypto==2.6.1
pycryptodome==3.23.0
pymemcache==4.0.0
PyOTP==2.10.0
python-dateutil==2.9.0.post0
python-dotenv==1.2.3
python-slugify==9.1.2
pytz==2026.4
rcssmin==1.2.2
requests==2.34.2
requests-file==3.0.1
rjsmin==1.2.5
setuptools==84.0.0
six==1.17.0
sqlparse==0.6.0
stripe==15.6.1
text-unidecode==1.3
tldextract==2.2.3
typing_extensions==4.16.0
tzdata==2026.4
tzlocal==5.4.4
Unidecode==1.4.0
urllib3==2.8.0
vine==5.1.0
wcwidth==0.9.1
webencodings==0.6.1
YURL==1.0.0

View file

@ -1,105 +0,0 @@
aldryn-apphooks-config==0.7.0
aldryn-boilerplates==0.8.0
aldryn-categories==1.2.0
aldryn-common==1.0.5
aldryn-newsblog==2.2.1
aldryn-people==2.2.0
aldryn-translation-tools==0.3.0
amqp==5.4.0
asgiref==3.12.1
babel==2.18.0
backport_collections==0.1
billiard==4.3.0
cdist==7.0.0
celery==5.6.3
certifi==2026.7.22
charset-normalizer==3.5.2
click==8.5.0
click-didyoumean==0.3.1
click-plugins==1.1.1.2
click-repl==0.4.0
cmsplugin-filer==1.1.3
Django==6.1.1
django-appconf==1.2.0
django-appdata==0.4.0
django-bootstrap3==26.2
django-classy-tags==0.8.0
django-cms==3.11.11
django-debug-toolbar==8.0.0
django-filer==3.6.0
django-formtools==2.1
django-guardian==3.5.0
django-js-asset==4.2.0
django-meta==2.5.1
django-meta-mixin==0.3.0
django-mptt==0.18.0
django-multisite==1.9.0
django-parler==2.4
django-phonenumber-field==1.3.0
django-polymorphic==4.11.7
django-recaptcha==4.1.0
django-reversion==6.3.0
django-sekizai==0.10.0
django-sortedm2m==4.0.0
django-stored-messages==1.4.0
django-taggit==6.1.0
django-taggit-autosuggest==0.4.2
django-taggit-templatetags==0.2.5
django-templatetag-sugar==1.0
django-treebeard==4.3.1
django_celery_results==2.6.0
django_compressor==4.6.0
djangocms-admin-style==3.3.1
djangocms-apphook-setup==0.5.1
djangocms-attributes-field==4.1.2
djangocms-file==4.0.1
djangocms-multisite==0.3.1
djangocms-page-meta==1.4.5
djangocms-picture==4.1.1
djangocms-text-ckeditor==5.1.7
djangocms-video==3.1.0
djangorestframework==3.18.1
easy-thumbnails==2.10.1
html5lib==1.1
idna==3.20
kombu==5.6.2
ldap3==2.9.1
lxml==6.1.3
lxml_html_clean==0.4.5
oca @ git+https://github.com/ungleich/python-oca.git@9bbda45683736a608c99d5e4bff65e50c93f734f
packaging==26.3
phonenumbers==9.0.40
phonenumberslite==9.0.40
pillow==12.3.0
pluggy==0.13.1
prompt_toolkit==3.0.53
psycopg2==2.9.13
py_svg_hush==0.3.0
pyasn1==0.6.4
pycrypto==2.6.1
pycryptodome==3.23.0
pymemcache==4.0.0
PyOTP==2.10.0
python-dateutil==2.9.0.post0
python-dotenv==1.2.3
python-slugify==9.1.2
pytz==2026.4
rcssmin==1.2.2
requests==2.34.2
requests-file==3.0.1
rjsmin==1.2.5
setuptools==84.0.0
six==1.17.0
sqlparse==0.6.0
stripe==15.6.1
text-unidecode==1.3
tldextract==2.2.3
typing_extensions==4.16.0
tzdata==2026.4
tzlocal==5.4.4
Unidecode==1.4.0
urllib3==2.8.0
vine==5.1.0
wcwidth==0.9.1
webencodings==0.6.1
YURL==1.0.0

View file

@ -1,11 +1,14 @@
class MultipleProxyMiddleware(object):
class MultipleProxyMiddleware:
FORWARDED_FOR_FIELDS = [
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED_HOST',
'HTTP_X_FORWARDED_SERVER',
]
def process_request(self, request):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
"""
Rewrites the proxy headers so that only the most
recent proxy is used.
@ -15,3 +18,6 @@ class MultipleProxyMiddleware(object):
if ',' in request.META[field]:
parts = request.META[field].split(',')
request.META[field] = parts[-1].strip()
response = self.get_response(request)
return response

View file

@ -0,0 +1,2 @@
__version__ = "1.4.5"
__author__ = "Iacopo Spalletti <i.spalletti@nephila.digital>"

107
vendor/djangocms_page_meta/admin.py vendored Normal file
View file

@ -0,0 +1,107 @@
from cms.admin.pageadmin import PageAdmin
from cms.extensions import PageExtensionAdmin, TitleExtensionAdmin
from cms.utils import get_language_from_request
from django.conf import settings
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .forms import GenericAttributeInlineForm, PageMetaAdminForm, TitleMetaAdminForm
from .models import DefaultMetaImage, GenericMetaAttribute, PageMeta, TitleMeta
@admin.register(DefaultMetaImage)
class DefaultMetaImageAdmin(admin.ModelAdmin):
actions = None
def has_add_permission(self, request):
return False
def has_delete_permission(self, request, obj=None):
return False
class GenericAttributePageInline(admin.TabularInline):
model = GenericMetaAttribute
form = GenericAttributeInlineForm
fields = ("page", "attribute", "name", "value")
extra = 1
class GenericAttributeTitleInline(admin.TabularInline):
model = GenericMetaAttribute
form = GenericAttributeInlineForm
fields = ("title", "attribute", "name", "value")
extra = 1
@admin.register(PageMeta)
class PageMetaAdmin(PageExtensionAdmin):
raw_id_fields = ("og_author",)
form = PageMetaAdminForm
inlines = (GenericAttributePageInline,)
fieldsets = (
(None, {"fields": ("image",)}),
(
_("OpenGraph"),
{
"fields": (
"og_type",
("og_author", "og_author_url", "og_author_fbid"),
("og_publisher", "og_app_id", "fb_pages"),
),
"classes": ("collapse",),
},
),
(_("Twitter Cards"), {"fields": ("twitter_type", "twitter_author"), "classes": ("collapse",)}),
(_("Schema.org microdata"), {"fields": ("schemaorg_type",), "classes": ("collapse")}),
(_("Robots"), {"fields": ("robots",), "classes": ("collapse")}),
)
class Media:
css = {"all": ("{}djangocms_page_meta/css/{}".format(settings.STATIC_URL, "djangocms_page_meta_admin.css"),)}
def get_model_perms(self, request):
"""
Return empty perms dict thus hiding the model from admin index.
"""
return {}
@admin.register(TitleMeta)
class TitleMetaAdmin(TitleExtensionAdmin):
form = TitleMetaAdminForm
inlines = (GenericAttributeTitleInline,)
class Media:
css = {"all": ("{}djangocms_page_meta/css/{}".format(settings.STATIC_URL, "djangocms_page_meta_admin.css"),)}
def get_model_perms(self, request):
"""
Return empty perms dict thus hiding the model from admin index.
"""
return {}
# Monkey patch the PageAdmin with a new get_form method
_BASE_PAGEADMIN__GET_FORM = PageAdmin.get_form
def get_form(self, request, obj=None, **kwargs):
"""
Patched method for PageAdmin.get_form.
Returns a page form without the base field 'meta_description' which is
overridden in djangocms-page-meta.
This is triggered in the page add view and in the change view if
the meta description of the page is empty.
"""
language = get_language_from_request(request, obj)
form = _BASE_PAGEADMIN__GET_FORM(self, request, obj, **kwargs)
if not obj or not obj.get_meta_description(language=language):
form.base_fields.pop("meta_description", None)
return form
PageAdmin.get_form = get_form

8
vendor/djangocms_page_meta/apps.py vendored Normal file
View file

@ -0,0 +1,8 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class PageMetaConfig(AppConfig):
name = "djangocms_page_meta"
verbose_name = _("django CMS Page Meta")
default_auto_field = "django.db.models.BigAutoField"

View file

@ -0,0 +1,105 @@
from cms.api import get_page_draft
from cms.cms_toolbars import PAGE_MENU_SECOND_BREAK
from cms.toolbar.items import Break
from cms.toolbar_base import CMSToolbar
from cms.toolbar_pool import toolbar_pool
from cms.utils.i18n import get_language_list, get_language_object
from cms.utils.permissions import has_page_permission
from django.urls import NoReverseMatch, reverse
from django.utils.translation import gettext_lazy as _
from .models import DefaultMetaImage, PageMeta, TitleMeta
try:
from cms.utils import get_cms_setting
except ImportError:
from cms.utils.conf import get_cms_setting
PAGE_META_MENU_TITLE = _("Meta-information")
PAGE_META_ITEM_TITLE = _("Common")
PAGE_META_DEFAULT_META_IMAGE_TITLE = _("Default meta image")
@toolbar_pool.register
class PageToolbarMeta(CMSToolbar):
def populate(self):
# always use draft if we have a page
self.page = get_page_draft(self.request.current_page)
if not self.page:
# Nothing to do
return
if self.page.is_page_type:
# we don't need this on page types
return
# check global permissions if CMS_PERMISSIONS is active
if get_cms_setting("PERMISSION"):
has_global_current_page_change_permission = has_page_permission(
self.request.user, self.request.current_page, "change_page"
)
else:
has_global_current_page_change_permission = False
# check if user has page edit permission
permission = self.request.current_page.has_change_permission(self.request.user)
can_change = self.request.current_page and permission
if has_global_current_page_change_permission or can_change:
not_edit_mode = not self.toolbar.edit_mode_active
current_page_menu = self.toolbar.get_or_create_menu("page")
super_item = current_page_menu.find_first(Break, identifier=PAGE_MENU_SECOND_BREAK)
if super_item:
super_item = super_item + 1
meta_menu = current_page_menu.get_or_create_menu("pagemeta", PAGE_META_MENU_TITLE, position=super_item)
position = 0
# Page tags
default_meta_image = DefaultMetaImage.objects.first()
if default_meta_image:
meta_menu.add_modal_item(
PAGE_META_DEFAULT_META_IMAGE_TITLE,
url=reverse("admin:djangocms_page_meta_defaultmetaimage_change", args=(default_meta_image.pk,)),
position=position,
)
position += 1
try:
page_extension = PageMeta.objects.get(extended_object_id=self.page.pk)
except PageMeta.DoesNotExist:
page_extension = None
try:
if page_extension:
url = reverse("admin:djangocms_page_meta_pagemeta_change", args=(page_extension.pk,))
else:
url = "{}?extended_object={}".format(
reverse("admin:djangocms_page_meta_pagemeta_add"), self.page.pk
)
except NoReverseMatch:
# not in urls
pass
else:
meta_menu.add_modal_item(PAGE_META_ITEM_TITLE, url=url, disabled=not_edit_mode, position=position)
# Title tags
site_id = self.page.node.site_id
titles = self.page.title_set.filter(language__in=get_language_list(site_id))
title_extensions = {
t.extended_object_id: t
for t in TitleMeta.objects.filter(extended_object_id__in=[title.id for title in titles])
}
for title in titles:
try:
if title.pk in title_extensions:
url = reverse(
"admin:djangocms_page_meta_titlemeta_change", args=(title_extensions[title.pk].pk,)
)
else:
url = "{}?extended_object={}".format(
reverse("admin:djangocms_page_meta_titlemeta_add"), title.pk
)
except NoReverseMatch:
# not in urls
pass
else:
position += 1
language = get_language_object(title.language)
meta_menu.add_modal_item(language["name"], url=url, disabled=not_edit_mode, position=position)

45
vendor/djangocms_page_meta/forms.py vendored Normal file
View file

@ -0,0 +1,45 @@
from django import forms
from django.core.validators import MaxLengthValidator
from .models import GenericMetaAttribute, PageMeta, TitleMeta
from .settings import get_setting
class PageMetaAdminForm(forms.ModelForm):
robots = forms.MultipleChoiceField(
choices=get_setting("ROBOTS_CHOICES"),
widget=forms.CheckboxSelectMultiple,
required=False,
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if kwargs.get("instance"):
self.initial["robots"] = kwargs.get("instance").robots_list
class Meta:
model = PageMeta
exclude = ()
class TitleMetaAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.base_fields["description"].validators = [MaxLengthValidator(get_setting("DESCRIPTION_LENGTH"))]
self.base_fields["twitter_description"].validators = [
MaxLengthValidator(get_setting("TWITTER_DESCRIPTION_LENGTH"))
]
super().__init__(*args, **kwargs)
class Meta:
model = TitleMeta
exclude = ()
class GenericAttributeInlineForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["attribute"].widget.attrs["placeholder"] = GenericMetaAttribute.DEFAULT_ATTRIBUTE
class Meta:
model = GenericMetaAttribute
exclude = ()

View file

@ -0,0 +1,232 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:11+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: Arabic (http://www.transifex.com/nephila/djangocms-page-meta/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: admin.py:32
msgid "OpenGraph"
msgstr ""
#: admin.py:42
msgid "Twitter Cards"
msgstr ""
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr ""
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr ""
#: cms_toolbars.py:20
msgid "Common"
msgstr ""
#: models.py:26
msgid "Used if title image is empty."
msgstr ""
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr ""
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr ""
#: models.py:38
msgid "Author account"
msgstr ""
#: models.py:43
msgid "Author Facebook URL"
msgstr ""
#: models.py:45
msgid "Author Facebook ID"
msgstr ""
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr ""
#: models.py:47
msgid "Website Facebook URL"
msgstr ""
#: models.py:48
msgid "Facebook App ID"
msgstr ""
#: models.py:49
msgid "Facebook Pages ID"
msgstr ""
#: models.py:51
msgid "Author Twitter Account"
msgstr ""
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr ""
#: models.py:54
msgid "Website Twitter Account"
msgstr ""
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr ""
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr ""
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr ""
#: models.py:103
msgid "Facebook Description"
msgstr ""
#: models.py:104
msgid "Twitter Description"
msgstr ""
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr ""
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr ""
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr ""
#: models.py:145
msgid "attribute"
msgstr ""
#: models.py:147
msgid "Custom attribute"
msgstr ""
#: models.py:152
msgid "name"
msgstr ""
#: models.py:154
msgid "Meta attribute name"
msgstr ""
#: models.py:157
msgid "value"
msgstr ""
#: models.py:159
msgid "Meta attribute value"
msgstr ""
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr ""
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,232 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:11+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: Bulgarian (http://www.transifex.com/nephila/djangocms-page-meta/language/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr ""
#: admin.py:42
msgid "Twitter Cards"
msgstr ""
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr ""
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr ""
#: cms_toolbars.py:20
msgid "Common"
msgstr ""
#: models.py:26
msgid "Used if title image is empty."
msgstr ""
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr ""
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr ""
#: models.py:38
msgid "Author account"
msgstr ""
#: models.py:43
msgid "Author Facebook URL"
msgstr ""
#: models.py:45
msgid "Author Facebook ID"
msgstr ""
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr ""
#: models.py:47
msgid "Website Facebook URL"
msgstr ""
#: models.py:48
msgid "Facebook App ID"
msgstr ""
#: models.py:49
msgid "Facebook Pages ID"
msgstr ""
#: models.py:51
msgid "Author Twitter Account"
msgstr ""
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr ""
#: models.py:54
msgid "Website Twitter Account"
msgstr ""
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr ""
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr ""
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr ""
#: models.py:103
msgid "Facebook Description"
msgstr ""
#: models.py:104
msgid "Twitter Description"
msgstr ""
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr ""
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr ""
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr ""
#: models.py:145
msgid "attribute"
msgstr ""
#: models.py:147
msgid "Custom attribute"
msgstr ""
#: models.py:152
msgid "name"
msgstr ""
#: models.py:154
msgid "Meta attribute name"
msgstr ""
#: models.py:157
msgid "value"
msgstr ""
#: models.py:159
msgid "Meta attribute value"
msgstr ""
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr ""
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,234 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# fsbraun <fsbraun@gmx.de>, 2016-2017
# djangoger <thomas.meitz@retailify.de>, 2014
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:11+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: German (http://www.transifex.com/nephila/djangocms-page-meta/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr "OpenGraph"
#: admin.py:42
msgid "Twitter Cards"
msgstr "Twitter Cards"
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr "django CMS Seiten-Meta"
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr "Meta-Information"
#: cms_toolbars.py:20
msgid "Common"
msgstr "Gemeinsam"
#: models.py:26
msgid "Used if title image is empty."
msgstr "Wird verwendet, wenn das Titelbild ist leer ist."
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr "Ressourcentyp"
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr "Nutze Artikel für generische Seiten."
#: models.py:38
msgid "Author account"
msgstr "Account des Autor"
#: models.py:43
msgid "Author Facebook URL"
msgstr "Facebook-URL des Autors"
#: models.py:45
msgid "Author Facebook ID"
msgstr "Facebook-ID des Autor"
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr "Nutze die numerische Facebook-ID"
#: models.py:47
msgid "Website Facebook URL"
msgstr "Facebook-URL der Wbsite"
#: models.py:48
msgid "Facebook App ID"
msgstr "Facebook App-ID"
#: models.py:49
msgid "Facebook Pages ID"
msgstr "Facebook Seiten-ID"
#: models.py:51
msgid "Author Twitter Account"
msgstr "Twitter-Account des Autors"
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr "„@“ nicht benötigt"
#: models.py:54
msgid "Website Twitter Account"
msgstr "Twitter-Account der Website"
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr "Meta-Informationen der Seite (alle Sprachen)"
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr "Meta für Seite {0}"
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr "Wenn nicht gesetzt, wird das Seitenbild wird für alle Sprachen genutzt."
#: models.py:103
msgid "Facebook Description"
msgstr "Facebook-Beschreibung"
#: models.py:104
msgid "Twitter Description"
msgstr "Twitter-Beschreibung"
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr ""
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr "Meta-Informationen der Seite (sprachabhängig)"
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr "Meta-Titel für {0}"
#: models.py:145
msgid "attribute"
msgstr "Attribut"
#: models.py:147
msgid "Custom attribute"
msgstr "Benutzerdefiniertes Attribut"
#: models.py:152
msgid "name"
msgstr "Name"
#: models.py:154
msgid "Meta attribute name"
msgstr "Name des Meta-Attribut"
#: models.py:157
msgid "value"
msgstr "Wert"
#: models.py:159
msgid "Meta attribute value"
msgstr "Wert des Meta-Attributs"
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr ""
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,233 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2017-12-30 18:56+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: English (http://www.transifex.com/nephila/djangocms-page-meta/"
"language/en/)\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr "OpenGraph"
#: admin.py:42
msgid "Twitter Cards"
msgstr "Twitter Cards"
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr "django CMS Page Meta"
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr "Meta-information"
#: cms_toolbars.py:20
msgid "Common"
msgstr "Common"
#: models.py:26
msgid "Used if title image is empty."
msgstr "Used if title image is empty."
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr "Resource type"
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr "Use Article for generic pages."
#: models.py:38
msgid "Author account"
msgstr "Author account"
#: models.py:43
msgid "Author Facebook URL"
msgstr "Author Facebook URL"
#: models.py:45
msgid "Author Facebook ID"
msgstr "Author Facebook ID"
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr "Use Facebook numeric ID"
#: models.py:47
msgid "Website Facebook URL"
msgstr "Website Facebook URL"
#: models.py:48
msgid "Facebook App ID"
msgstr "Facebook App ID"
#: models.py:49
msgid "Facebook Pages ID"
msgstr "Facebook Pages ID"
#: models.py:51
msgid "Author Twitter Account"
msgstr "Author Twitter Account"
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr "\"@\" character not required."
#: models.py:54
msgid "Website Twitter Account"
msgstr "Website Twitter Account"
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr "Page meta info (all languages)"
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr "Page Meta for {0}"
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr "If empty, page image will be used for all languages."
#: models.py:103
msgid "Facebook Description"
msgstr "Facebook Description"
#: models.py:104
msgid "Twitter Description"
msgstr "Twitter Description"
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#, fuzzy
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr "Facebook Description"
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr "Page meta info (language-dependent)"
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr "Title Meta for {0}"
#: models.py:145
msgid "attribute"
msgstr "attribute"
#: models.py:147
msgid "Custom attribute"
msgstr "Custom attribute"
#: models.py:152
msgid "name"
msgstr "name"
#: models.py:154
msgid "Meta attribute name"
msgstr "Meta attribute name"
#: models.py:157
msgid "value"
msgstr "value"
#: models.py:159
msgid "Meta attribute value"
msgstr "Meta attribute value"
#: models.py:168 models.py:170
#, fuzzy, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr "Attribute {0} for page {1}"
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,233 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# David <d.diazp@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:11+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: Spanish (http://www.transifex.com/nephila/djangocms-page-meta/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr "OpenGraph"
#: admin.py:42
msgid "Twitter Cards"
msgstr "Twitter Cards"
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr ""
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr "Meta-información"
#: cms_toolbars.py:20
msgid "Common"
msgstr "Común"
#: models.py:26
msgid "Used if title image is empty."
msgstr "Usado si el título de la imagen está vacío."
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr "Tipo de recurso"
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr "Utilice el artículo para las páginas genéricas."
#: models.py:38
msgid "Author account"
msgstr "Cuenta de autor"
#: models.py:43
msgid "Author Facebook URL"
msgstr "URL de Facebook del autor"
#: models.py:45
msgid "Author Facebook ID"
msgstr "ID de Facebook del autor"
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr "Usar ID numérico de Facebook"
#: models.py:47
msgid "Website Facebook URL"
msgstr "URL de Facebook del sitio web"
#: models.py:48
msgid "Facebook App ID"
msgstr "ID de aplicación de Facebook"
#: models.py:49
msgid "Facebook Pages ID"
msgstr ""
#: models.py:51
msgid "Author Twitter Account"
msgstr "Cuenta de Twitter del autor"
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr ""
#: models.py:54
msgid "Website Twitter Account"
msgstr "Cuenta de Twitter del sitio web"
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr "Información meta de la página (todos los lenguajes)"
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr ""
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr "Si está vacío, la imagen de página se usará para todos los lenguajes."
#: models.py:103
msgid "Facebook Description"
msgstr "Descripción de Facebook"
#: models.py:104
msgid "Twitter Description"
msgstr "Descripción de Twitter"
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr ""
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr "Meta información de la página (independiente del lenguaje)"
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr ""
#: models.py:145
msgid "attribute"
msgstr ""
#: models.py:147
msgid "Custom attribute"
msgstr ""
#: models.py:152
msgid "name"
msgstr ""
#: models.py:154
msgid "Meta attribute name"
msgstr ""
#: models.py:157
msgid "value"
msgstr ""
#: models.py:159
msgid "Meta attribute value"
msgstr ""
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr ""
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,233 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# yakky <i.spalletti@nephila.digital>, 2014,2017,2019-2020
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:12+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: Italian (http://www.transifex.com/nephila/djangocms-page-meta/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr "OpenGraph"
#: admin.py:42
msgid "Twitter Cards"
msgstr "Twitter Cards"
#: admin.py:43
msgid "Schema.org microdata"
msgstr "Microdata Schema.org"
#: apps.py:7
msgid "django CMS Page Meta"
msgstr "django CMS Page Meta"
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr "Metainformazioni"
#: cms_toolbars.py:20
msgid "Common"
msgstr "Generale"
#: models.py:26
msgid "Used if title image is empty."
msgstr "Usato se l'immagine per il Titolo è vuota."
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr "Tipo di risorsa"
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr "Usa \"Articolo\" per le pagine normali."
#: models.py:38
msgid "Author account"
msgstr "Account dell'Autore"
#: models.py:43
msgid "Author Facebook URL"
msgstr "URL Facebook dell'Autore"
#: models.py:45
msgid "Author Facebook ID"
msgstr "Facebook ID dell'Autore"
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr "Inserisco il Facebook ID numerico"
#: models.py:47
msgid "Website Facebook URL"
msgstr "URL Facebook del sito"
#: models.py:48
msgid "Facebook App ID"
msgstr "App ID Facebook"
#: models.py:49
msgid "Facebook Pages ID"
msgstr "ID Facebook della pagina"
#: models.py:51
msgid "Author Twitter Account"
msgstr "Account Twitter dell'autore"
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr "Carattere \"@\" non richiesto."
#: models.py:54
msgid "Website Twitter Account"
msgstr "Account Twitter del sito"
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr "Metainformazioni (tuttle le lingue)"
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr "Meta-info pagina per {0}"
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr "Se vuota, l'immagine della pagina sarà usata in tutte le lingue."
#: models.py:103
msgid "Facebook Description"
msgstr "Descrizione Facebook"
#: models.py:104
msgid "Twitter Description"
msgstr "Descrizione Twitter"
#: models.py:106
msgid "Schemaorg Name"
msgstr "Nome Schema.org"
#: models.py:106
msgid "Name of the item."
msgstr "Nome dell'elemento"
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr "Descrizione Schema.org"
#: models.py:109
msgid "Description of the item."
msgstr "Descrizione dell'elemento"
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr "Metainformazioni (per lingua)"
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr "Meta-info titolo per {0}"
#: models.py:145
msgid "attribute"
msgstr "attributo"
#: models.py:147
msgid "Custom attribute"
msgstr "Attributo personalizzato"
#: models.py:152
msgid "name"
msgstr "nome"
#: models.py:154
msgid "Meta attribute name"
msgstr "Nome dell'attributo"
#: models.py:157
msgid "value"
msgstr "valore"
#: models.py:159
msgid "Meta attribute value"
msgstr "Valore dell'attributo"
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr "Attributo {0} di {1}"
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,233 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Matas Dailyda <matas@dailyda.com>, 2015,2018
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:11+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: Lithuanian (http://www.transifex.com/nephila/djangocms-page-meta/language/lt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: lt\n"
"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr "OpenGraph"
#: admin.py:42
msgid "Twitter Cards"
msgstr "Twitter Cards"
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr "django CMS Puslapio Meta"
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr "Meta informacija"
#: cms_toolbars.py:20
msgid "Common"
msgstr "Bendri"
#: models.py:26
msgid "Used if title image is empty."
msgstr "Naudojamas jei nėra pirminio paveikslėlio."
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr "Resurso tipas"
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr "Naudoti straipsnį bendriniams puslapiams."
#: models.py:38
msgid "Author account"
msgstr "Autoriaus paskyra"
#: models.py:43
msgid "Author Facebook URL"
msgstr "Autoriaus Facebook URL"
#: models.py:45
msgid "Author Facebook ID"
msgstr "Autoriaus Facebook ID"
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr "Naudoto Facebook skaitinį ID"
#: models.py:47
msgid "Website Facebook URL"
msgstr "Tinklalapio Facebook URL"
#: models.py:48
msgid "Facebook App ID"
msgstr "Facebook aplikacijos ID"
#: models.py:49
msgid "Facebook Pages ID"
msgstr "Facebook puslapių ID"
#: models.py:51
msgid "Author Twitter Account"
msgstr "Autoriaus Twitter paskyra"
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr "\"@\" simbolis nereikalingas."
#: models.py:54
msgid "Website Twitter Account"
msgstr "Tinklalapio Twitter vartotojas"
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr "Puslapio meta duomenys (visoms kalboms)"
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr "Puslapio meta {0}"
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr "Jei tuščia, puslapio paveikslėlis bus naudojamas visoms kalboms."
#: models.py:103
msgid "Facebook Description"
msgstr "Facebook aprašymas"
#: models.py:104
msgid "Twitter Description"
msgstr "Twitter aprašymas"
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr ""
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr "Puslapio meta duomenys (priklausantys nuo kalbos)"
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr "Pavadinimo meta {0}"
#: models.py:145
msgid "attribute"
msgstr "atributas"
#: models.py:147
msgid "Custom attribute"
msgstr "Specialus atributas"
#: models.py:152
msgid "name"
msgstr "pavadinimas"
#: models.py:154
msgid "Meta attribute name"
msgstr "Meta atributo pavadinimas"
#: models.py:157
msgid "value"
msgstr "reikšmė"
#: models.py:159
msgid "Meta attribute value"
msgstr "Meta atributo reikšmė"
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr ""
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,232 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:11+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/nephila/djangocms-page-meta/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr ""
#: admin.py:42
msgid "Twitter Cards"
msgstr ""
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr ""
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr ""
#: cms_toolbars.py:20
msgid "Common"
msgstr ""
#: models.py:26
msgid "Used if title image is empty."
msgstr ""
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr ""
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr ""
#: models.py:38
msgid "Author account"
msgstr ""
#: models.py:43
msgid "Author Facebook URL"
msgstr ""
#: models.py:45
msgid "Author Facebook ID"
msgstr ""
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr ""
#: models.py:47
msgid "Website Facebook URL"
msgstr ""
#: models.py:48
msgid "Facebook App ID"
msgstr ""
#: models.py:49
msgid "Facebook Pages ID"
msgstr ""
#: models.py:51
msgid "Author Twitter Account"
msgstr ""
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr ""
#: models.py:54
msgid "Website Twitter Account"
msgstr ""
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr ""
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr ""
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr ""
#: models.py:103
msgid "Facebook Description"
msgstr ""
#: models.py:104
msgid "Twitter Description"
msgstr ""
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr ""
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr ""
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr ""
#: models.py:145
msgid "attribute"
msgstr ""
#: models.py:147
msgid "Custom attribute"
msgstr ""
#: models.py:152
msgid "name"
msgstr ""
#: models.py:154
msgid "Meta attribute name"
msgstr ""
#: models.py:157
msgid "value"
msgstr ""
#: models.py:159
msgid "Meta attribute value"
msgstr ""
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr ""
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,233 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Rustam Mirzaev <mirus@2x2.pw>, 2015
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:11+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: Russian (http://www.transifex.com/nephila/djangocms-page-meta/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr "OpenGraph"
#: admin.py:42
msgid "Twitter Cards"
msgstr "Twitter Cards"
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr ""
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr "Мета информация"
#: cms_toolbars.py:20
msgid "Common"
msgstr "Общие"
#: models.py:26
msgid "Used if title image is empty."
msgstr "Используется, если изображение отсутствует"
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr "Тип ресурса"
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr "Использовать статью для общих страниц"
#: models.py:38
msgid "Author account"
msgstr "Аккаунт автора"
#: models.py:43
msgid "Author Facebook URL"
msgstr "URL автора на Facebook"
#: models.py:45
msgid "Author Facebook ID"
msgstr "ID автора на Facebook"
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr "Использовать номерной идентификатор Facebook"
#: models.py:47
msgid "Website Facebook URL"
msgstr "Адрес веб сайта на Facebook"
#: models.py:48
msgid "Facebook App ID"
msgstr "ID приложения на Facebook"
#: models.py:49
msgid "Facebook Pages ID"
msgstr ""
#: models.py:51
msgid "Author Twitter Account"
msgstr "Аккаунт автора на Twitter"
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr ""
#: models.py:54
msgid "Website Twitter Account"
msgstr "Аккаунт сайта на Twitter"
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr "Мета информация страницы(для всех языков)"
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr ""
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr "Если оставить пустым, изображение страницы будет использовано для всех языков."
#: models.py:103
msgid "Facebook Description"
msgstr "Описание на Facebook"
#: models.py:104
msgid "Twitter Description"
msgstr "Описание на Twitter"
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr ""
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr "Мета информация страницы(языкозависимая)"
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr ""
#: models.py:145
msgid "attribute"
msgstr ""
#: models.py:147
msgid "Custom attribute"
msgstr ""
#: models.py:152
msgid "name"
msgstr ""
#: models.py:154
msgid "Meta attribute name"
msgstr ""
#: models.py:157
msgid "value"
msgstr ""
#: models.py:159
msgid "Meta attribute value"
msgstr ""
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr ""
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,233 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Rustam Mirzaev <mirus@2x2.pw>, 2015
msgid ""
msgstr ""
"Project-Id-Version: djangocms-page-meta\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-12-20 13:10+0100\n"
"PO-Revision-Date: 2020-12-20 12:11+0000\n"
"Last-Translator: yakky <i.spalletti@nephila.digital>\n"
"Language-Team: Turkish (http://www.transifex.com/nephila/djangocms-page-meta/language/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: admin.py:32
msgid "OpenGraph"
msgstr "OpenGraph"
#: admin.py:42
msgid "Twitter Cards"
msgstr "Twitter Cards"
#: admin.py:43
msgid "Schema.org microdata"
msgstr ""
#: apps.py:7
msgid "django CMS Page Meta"
msgstr ""
#: cms_toolbars.py:19
msgid "Meta-information"
msgstr "Meta-bilgiler"
#: cms_toolbars.py:20
msgid "Common"
msgstr "Genel"
#: models.py:26
msgid "Used if title image is empty."
msgstr "Başlık resmi olmadığında kullanılır"
#: models.py:30 models.py:61 models.py:65
msgid "Resource type"
msgstr "Kaynak tipi"
#: models.py:34 models.py:69
msgid "Use Article for generic pages."
msgstr "Makaleyi genel sayfalar için kullan"
#: models.py:38
msgid "Author account"
msgstr "Yazarın hesabı"
#: models.py:43
msgid "Author Facebook URL"
msgstr "Yazarın Facebook URL'i"
#: models.py:45
msgid "Author Facebook ID"
msgstr "Yazarın Facebook ID'si"
#: models.py:45
msgid "Use Facebook numeric ID."
msgstr "Facebook ID'yi kullan"
#: models.py:47
msgid "Website Facebook URL"
msgstr "Web sitenin Facebook'taki URL'si"
#: models.py:48
msgid "Facebook App ID"
msgstr "Facebook Uygulama ID'si"
#: models.py:49
msgid "Facebook Pages ID"
msgstr ""
#: models.py:51
msgid "Author Twitter Account"
msgstr "Yazarın Twitter hesabı"
#: models.py:51 models.py:58
msgid "'@' character not required."
msgstr ""
#: models.py:54
msgid "Website Twitter Account"
msgstr "Web sitenin Twitter hesabı"
#: models.py:73 models.py:74
msgid "Page meta info (all languages)"
msgstr "Sayfanın meta bilgileri(tüm diller)"
#: models.py:77
#, python-brace-format
msgid "Page Meta for {0}"
msgstr ""
#: models.py:98
msgid "If empty, page image will be used for all languages."
msgstr "Eğer boş ise, sayfanın resmi tüm diller için kullanılacaktır"
#: models.py:103
msgid "Facebook Description"
msgstr "Facebook özeti"
#: models.py:104
msgid "Twitter Description"
msgstr "Twitter özeti"
#: models.py:106
msgid "Schemaorg Name"
msgstr ""
#: models.py:106
msgid "Name of the item."
msgstr ""
#: models.py:109
#| msgid "Facebook Description"
msgid "Schemaorg Description"
msgstr ""
#: models.py:109
msgid "Description of the item."
msgstr ""
#: models.py:113 models.py:114 models.py:163 models.py:164
msgid "Page meta info (language-dependent)"
msgstr "Sayfanın meta bilgileri(dil bağımlı)"
#: models.py:117
#, python-brace-format
msgid "Title Meta for {0}"
msgstr ""
#: models.py:145
msgid "attribute"
msgstr ""
#: models.py:147
msgid "Custom attribute"
msgstr ""
#: models.py:152
msgid "name"
msgstr ""
#: models.py:154
msgid "Meta attribute name"
msgstr ""
#: models.py:157
msgid "value"
msgstr ""
#: models.py:159
msgid "Meta attribute value"
msgstr ""
#: models.py:168 models.py:170
#, python-brace-format
#| msgid "Attribute {0} for page {1}"
msgid "Attribute {0} for {1}"
msgstr ""
#~ msgid "Google+ Snippets"
#~ msgstr "Google+ Snippets"
#~ msgid "Author Google+ URL"
#~ msgstr "Author Google+ URL"
#~ msgid "Use the Google+ Name (together with \"+\")"
#~ msgstr "Use the Google+ Name (together with \"+\")"
#~ msgid "Google+ Description"
#~ msgstr "Google+ Description"
#~ msgid "Attribute {0} for title {1}"
#~ msgstr "Attribute {0} for title {1}"
#~ msgid "Article"
#~ msgstr "Article"
#~ msgid "Website"
#~ msgstr "Website"
#~ msgid "Summary"
#~ msgstr "Summary"
#~ msgid "Summary large image"
#~ msgstr "Summary large image"
#~ msgid "Product"
#~ msgstr "Product"
#~ msgid "Photo"
#~ msgstr "Photo"
#~ msgid "Player"
#~ msgstr "Player"
#~ msgid "App"
#~ msgstr "App"
#~ msgid "Blog"
#~ msgstr "Blog"
#~ msgid "Book"
#~ msgstr "Book"
#~ msgid "Event"
#~ msgstr "Event"
#~ msgid "LocalBusiness"
#~ msgstr "LocalBusiness"
#~ msgid "Organization"
#~ msgstr "Organization"
#~ msgid "Person"
#~ msgstr "Person"
#~ msgid "Review"
#~ msgstr "Review"

View file

@ -0,0 +1,203 @@
import filer.fields.file
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
(
"cms",
"0001_initial_squashed_0022_auto_20180620_1551",
),
(
"filer",
"0001_squashed_0016_alter_folder_index_together_remove_folder_level_and_more",
),
]
operations = [
migrations.CreateModel(
name="PageMeta",
fields=[
("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)),
(
"og_type",
models.CharField(
help_text="Use Article for generic pages.",
max_length=255,
verbose_name="Resource type",
choices=[(b"article", "Article"), (b"website", "Website")],
),
),
(
"og_author_url",
models.CharField(default=b"", max_length=255, verbose_name="Author Facebook URL", blank=True),
),
(
"og_author_fbid",
models.CharField(
default=b"",
help_text="Use Facebook numeric ID",
max_length=16,
verbose_name="Author Facebook ID",
blank=True,
),
),
(
"og_publisher",
models.CharField(default=b"", max_length=255, verbose_name="Website Facebook URL", blank=True),
),
(
"og_app_id",
models.CharField(default=b"", max_length=255, verbose_name="Facebook App ID", blank=True),
),
(
"twitter_author",
models.CharField(
default=b"",
help_text='"@" sign not required.',
max_length=255,
verbose_name="Author Twitter Account",
blank=True,
),
),
(
"twitter_site",
models.CharField(
default=b"",
help_text='"@" sign not required.',
max_length=255,
verbose_name="Website Twitter Account",
blank=True,
),
),
(
"twitter_type",
models.CharField(
max_length=255,
verbose_name="Resource type",
choices=[
(b"summary", "Summary"),
(b"summary_large_image", "Summary large image"),
(b"product", "Product"),
(b"photo", "Photo"),
(b"player", "Player"),
(b"app", "App"),
],
),
),
(
"gplus_author",
models.CharField(
default=b"",
help_text='Use the Google+ Name (together with "+") or the complete path to the page.',
max_length=255,
verbose_name="Author Google+ URL",
blank=True,
),
),
(
"gplus_type",
models.CharField(
help_text="Use Article for generic pages.",
max_length=255,
verbose_name="Resource type",
choices=[
(b"Article", "Article"),
(b"Blog", "Blog"),
(b"Book", "Book"),
(b"Event", "Event"),
(b"LocalBusiness", "LocalBusiness"),
(b"Organization", "Organization"),
(b"Person", "Person"),
(b"Product", "Product"),
(b"Review", "Review"),
],
),
),
("extended_object", models.OneToOneField(editable=False, to="cms.Page", on_delete=models.CASCADE)),
(
"image",
filer.fields.file.FilerFileField(
related_name="djangocms_page_meta_page",
blank=True,
to="filer.File",
help_text="Used if title image is empty.",
null=True,
on_delete=models.CASCADE,
),
),
(
"og_author",
models.ForeignKey(
verbose_name="Author account",
blank=True,
to=settings.AUTH_USER_MODEL,
null=True,
on_delete=models.CASCADE,
),
),
(
"public_extension",
models.OneToOneField(
related_name="draft_extension",
null=True,
editable=False,
to="djangocms_page_meta.PageMeta",
on_delete=models.CASCADE,
),
),
],
options={
"verbose_name": "Page meta info (all languages)",
},
bases=(models.Model,),
),
migrations.CreateModel(
name="TitleMeta",
fields=[
("id", models.AutoField(verbose_name="ID", serialize=False, auto_created=True, primary_key=True)),
("keywords", models.CharField(default=b"", max_length=400, blank=True)),
("description", models.CharField(default=b"", max_length=400, blank=True)),
(
"og_description",
models.CharField(default=b"", max_length=400, verbose_name="Facebook Description", blank=True),
),
(
"twitter_description",
models.CharField(default=b"", max_length=140, verbose_name="Twitter Description", blank=True),
),
(
"gplus_description",
models.CharField(default=b"", max_length=400, verbose_name="Google+ Description", blank=True),
),
("extended_object", models.OneToOneField(editable=False, to="cms.pagecontent", on_delete=models.CASCADE)),
(
"image",
filer.fields.file.FilerFileField(
related_name="djangocms_page_meta_title",
blank=True,
to="filer.File",
help_text="If empty, page image will be used for all languages.",
null=True,
on_delete=models.CASCADE,
),
),
(
"public_extension",
models.OneToOneField(
related_name="draft_extension",
null=True,
editable=False,
to="djangocms_page_meta.TitleMeta",
on_delete=models.CASCADE,
),
),
],
options={
"verbose_name": "Page meta info (language-dependent)",
},
bases=(models.Model,),
),
]

View file

@ -0,0 +1,21 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name="pagemeta",
name="og_author_fbid",
field=models.CharField(
default=b"",
help_text="Use Facebook numeric ID.",
max_length=16,
verbose_name="Author Facebook ID",
blank=True,
),
),
]

View file

@ -0,0 +1,43 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0002_auto_20150807_0936"),
]
operations = [
migrations.AlterField(
model_name="pagemeta",
name="gplus_author",
field=models.CharField(
default="",
help_text="Use the Google+ Name (together with ) or the complete path to the page.",
max_length=255,
verbose_name="Author Google+ URL",
blank=True,
),
),
migrations.AlterField(
model_name="pagemeta",
name="twitter_author",
field=models.CharField(
default="",
help_text="'@' character not required.",
max_length=255,
verbose_name="Author Twitter Account",
blank=True,
),
),
migrations.AlterField(
model_name="pagemeta",
name="twitter_site",
field=models.CharField(
default="",
help_text="'@' characther not required.",
max_length=255,
verbose_name="Website Twitter Account",
blank=True,
),
),
]

View file

@ -0,0 +1,104 @@
# Generated by Django 1.9.3 on 2016-04-09 16:52
from django.db import migrations, models
from meta import settings
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0003_auto_20151220_1734"),
]
operations = [
migrations.AlterField(
model_name="pagemeta",
name="gplus_author",
field=models.CharField(
blank=True,
default="",
help_text='Use the Google+ Name (together with "+")',
max_length=255,
verbose_name="Author Google+ URL",
),
),
migrations.AlterField(
model_name="pagemeta",
name="gplus_type",
field=models.CharField(
blank=True,
choices=(""),
help_text="Use Article for generic pages.",
max_length=255,
verbose_name="Resource type",
),
),
migrations.AlterField(
model_name="pagemeta",
name="og_app_id",
field=models.CharField(blank=True, default="", max_length=255, verbose_name="Facebook App ID"),
),
migrations.AlterField(
model_name="pagemeta",
name="og_author_fbid",
field=models.CharField(
blank=True,
default="",
help_text="Use Facebook numeric ID.",
max_length=16,
verbose_name="Author Facebook ID",
),
),
migrations.AlterField(
model_name="pagemeta",
name="og_author_url",
field=models.CharField(blank=True, default="", max_length=255, verbose_name="Author Facebook URL"),
),
migrations.AlterField(
model_name="pagemeta",
name="og_publisher",
field=models.CharField(blank=True, default="", max_length=255, verbose_name="Website Facebook URL"),
),
migrations.AlterField(
model_name="pagemeta",
name="og_type",
field=models.CharField(
blank=True,
choices=settings.FB_TYPES,
help_text="Use Article for generic pages.",
max_length=255,
verbose_name="Resource type",
),
),
migrations.AlterField(
model_name="pagemeta",
name="twitter_type",
field=models.CharField(
blank=True, choices=settings.TWITTER_TYPES, max_length=255, verbose_name="Resource type"
),
),
migrations.AlterField(
model_name="titlemeta",
name="description",
field=models.CharField(blank=True, default="", max_length=400),
),
migrations.AlterField(
model_name="titlemeta",
name="gplus_description",
field=models.CharField(blank=True, default="", max_length=400, verbose_name="Google+ Description"),
),
migrations.AlterField(
model_name="titlemeta",
name="keywords",
field=models.CharField(blank=True, default="", max_length=400),
),
migrations.AlterField(
model_name="titlemeta",
name="og_description",
field=models.CharField(blank=True, default="", max_length=400, verbose_name="Facebook Description"),
),
migrations.AlterField(
model_name="titlemeta",
name="twitter_description",
field=models.CharField(blank=True, default="", max_length=140, verbose_name="Twitter Description"),
),
]

View file

@ -0,0 +1,17 @@
# Generated by Django 1.9.5 on 2016-04-23 13:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0004_auto_20160409_1852"),
]
operations = [
migrations.AddField(
model_name="pagemeta",
name="fb_pages",
field=models.CharField(blank=True, default="", max_length=255, verbose_name="Facebook Pages ID"),
),
]

View file

@ -0,0 +1,64 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0005_pagemeta_fb_pages"),
]
operations = [
migrations.CreateModel(
name="GenericMetaAttribute",
fields=[
("id", models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name="ID")),
(
"attribute",
models.CharField(
blank=True, help_text="Custom attribute", max_length=200, default="", verbose_name="attribute"
),
),
("name", models.CharField(help_text="Meta attribute name", max_length=200, verbose_name="name")),
("value", models.CharField(help_text="Meta attribute value", max_length=2000, verbose_name="value")),
],
options={
"verbose_name_plural": "Page meta info (language-dependent)",
"verbose_name": "Page meta info (language-dependent)",
},
),
migrations.AlterModelOptions(
name="pagemeta",
options={
"verbose_name_plural": "Page meta info (all languages)",
"verbose_name": "Page meta info (all languages)",
},
),
migrations.AlterModelOptions(
name="titlemeta",
options={
"verbose_name_plural": "Page meta info (language-dependent)",
"verbose_name": "Page meta info (language-dependent)",
},
),
migrations.AddField(
model_name="genericmetaattribute",
name="page",
field=models.ForeignKey(
related_name="extra",
blank=True,
null=True,
to="djangocms_page_meta.PageMeta",
on_delete=models.CASCADE,
),
),
migrations.AddField(
model_name="genericmetaattribute",
name="title",
field=models.ForeignKey(
related_name="extra",
blank=True,
null=True,
to="djangocms_page_meta.TitleMeta",
on_delete=models.CASCADE,
),
),
]

View file

@ -0,0 +1,50 @@
# Generated by Django 1.9.6 on 2016-05-30 20:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0006_auto_20160423_1859"),
]
operations = [
migrations.AlterModelOptions(
name="genericmetaattribute",
options={
"verbose_name": "Page meta info (language-dependent)",
"verbose_name_plural": "Page meta info (language-dependent)",
},
),
migrations.AlterModelOptions(
name="pagemeta",
options={
"verbose_name": "Page meta info (all languages)",
"verbose_name_plural": "Page meta info (all languages)",
},
),
migrations.AlterModelOptions(
name="titlemeta",
options={
"verbose_name": "Page meta info (language-dependent)",
"verbose_name_plural": "Page meta info (language-dependent)",
},
),
migrations.AlterField(
model_name="genericmetaattribute",
name="attribute",
field=models.CharField(
blank=True, default="", help_text="Custom attribute", max_length=200, verbose_name="attribute"
),
),
migrations.AlterField(
model_name="genericmetaattribute",
name="name",
field=models.CharField(help_text="Meta attribute name", max_length=200, verbose_name="name"),
),
migrations.AlterField(
model_name="genericmetaattribute",
name="value",
field=models.CharField(help_text="Meta attribute value", max_length=2000, verbose_name="value"),
),
]

View file

@ -0,0 +1,16 @@
# Generated by Django 1.9.6 on 2016-06-09 05:54
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0007_auto_20160530_2257"),
]
operations = [
migrations.AlterUniqueTogether(
name="genericmetaattribute",
unique_together=set(),
),
]

View file

@ -0,0 +1,23 @@
# Generated by Django 1.11.8 on 2017-12-30 18:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0008_auto_20160609_0754"),
]
operations = [
migrations.AlterField(
model_name="pagemeta",
name="twitter_site",
field=models.CharField(
blank=True,
default="",
help_text="'@' character not required.",
max_length=255,
verbose_name="Website Twitter Account",
),
),
]

View file

@ -0,0 +1,37 @@
# Generated by Django 1.11.9 on 2018-01-08 22:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0009_auto_20171230_1954"),
]
operations = [
migrations.AlterField(
model_name="titlemeta",
name="description",
field=models.CharField(blank=True, default="", max_length=2000),
),
migrations.AlterField(
model_name="titlemeta",
name="gplus_description",
field=models.CharField(blank=True, default="", max_length=2000, verbose_name="Google+ Description"),
),
migrations.AlterField(
model_name="titlemeta",
name="keywords",
field=models.CharField(blank=True, default="", max_length=2000),
),
migrations.AlterField(
model_name="titlemeta",
name="og_description",
field=models.CharField(blank=True, default="", max_length=2000, verbose_name="Facebook Description"),
),
migrations.AlterField(
model_name="titlemeta",
name="twitter_description",
field=models.CharField(blank=True, default="", max_length=2000, verbose_name="Twitter Description"),
),
]

View file

@ -0,0 +1,103 @@
# Generated by Django 2.1.7 on 2019-02-18 10:10
import django.db.models.deletion
import filer.fields.file
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0010_auto_20180108_2316"),
]
operations = [
migrations.AlterField(
model_name="genericmetaattribute",
name="page",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="extra",
to="djangocms_page_meta.PageMeta",
),
),
migrations.AlterField(
model_name="genericmetaattribute",
name="title",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="extra",
to="djangocms_page_meta.TitleMeta",
),
),
migrations.AlterField(
model_name="pagemeta",
name="image",
field=filer.fields.file.FilerFileField(
blank=True,
help_text="Used if title image is empty.",
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="djangocms_page_meta_page",
to="filer.File",
),
),
migrations.AlterField(
model_name="pagemeta",
name="og_author",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
verbose_name="Author account",
),
),
migrations.AlterField(
model_name="pagemeta",
name="public_extension",
field=models.OneToOneField(
editable=False,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="draft_extension",
to="djangocms_page_meta.PageMeta",
),
),
migrations.AlterField(
model_name="titlemeta",
name="extended_object",
field=models.OneToOneField(
editable=False,
on_delete=django.db.models.deletion.CASCADE,
to="cms.PageContent",
),
),
migrations.AlterField(
model_name="titlemeta",
name="image",
field=filer.fields.file.FilerFileField(
blank=True,
help_text="If empty, page image will be used for all languages.",
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="djangocms_page_meta_title",
to="filer.File",
),
),
migrations.AlterField(
model_name="titlemeta",
name="public_extension",
field=models.OneToOneField(
editable=False,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="draft_extension",
to="djangocms_page_meta.TitleMeta",
),
),
]

View file

@ -0,0 +1,31 @@
# Generated by Django 2.2 on 2020-07-06 12:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0011_auto_20190218_1010"),
]
operations = [
migrations.RemoveField(
model_name="pagemeta",
name="gplus_author",
),
migrations.RemoveField(
model_name="pagemeta",
name="gplus_type",
),
migrations.RemoveField(
model_name="titlemeta",
name="gplus_description",
),
migrations.AddField(
model_name="pagemeta",
name="schemaorg_type",
field=models.CharField(
blank=True, help_text="Use Article for generic pages.", max_length=255, verbose_name="Resource type"
),
),
]

View file

@ -0,0 +1,50 @@
# Generated by Django 2.2 on 2020-08-21 14:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0012_auto_20200706_1230"),
]
operations = [
migrations.AddField(
model_name="titlemeta",
name="schemaorg_description",
field=models.CharField(
blank=True, help_text="Description of the item.", max_length=255, verbose_name="Schemaorg Description"
),
),
migrations.AddField(
model_name="titlemeta",
name="schemaorg_name",
field=models.CharField(
blank=True, help_text="Name of the item.", max_length=255, verbose_name="Schemaorg Name"
),
),
migrations.AlterField(
model_name="pagemeta",
name="schemaorg_type",
field=models.CharField(
blank=True,
choices=[
("Article", "Article"),
("Blog", "Blog"),
("WebPage", "Page"),
("WebSite", "WebSite"),
("Event", "Event"),
("Product", "Product"),
("Place", "Place"),
("Person", "Person"),
("Book", "Book"),
("LocalBusiness", "LocalBusiness"),
("Organization", "Organization"),
("Review", "Review"),
],
help_text="Use Article for generic pages.",
max_length=255,
verbose_name="Resource type",
),
),
]

View file

@ -0,0 +1,32 @@
# Generated by Django 4.2.4 on 2023-08-03 13:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0013_auto_20200821_1457"),
]
operations = [
migrations.AddField(
model_name="pagemeta",
name="robots",
field=models.CharField(blank=True, max_length=512, verbose_name="Robots meta tag"),
),
migrations.AlterField(
model_name="genericmetaattribute",
name="id",
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"),
),
migrations.AlterField(
model_name="pagemeta",
name="id",
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"),
),
migrations.AlterField(
model_name="titlemeta",
name="id",
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"),
),
]

View file

@ -0,0 +1,37 @@
# Generated by Django 4.2.4 on 2023-08-30 08:06
import django.db.models.deletion
import filer.fields.file
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("filer", "0017_image__transparent"),
("djangocms_page_meta", "0014_pagemeta_robots_alter_genericmetaattribute_id_and_more"),
]
operations = [
migrations.CreateModel(
name="DefaultMetaImage",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
(
"image",
filer.fields.file.FilerFileField(
blank=True,
help_text="Default image for og:image, twitter:image and schema.org image."
"\nYou can override this by setting the image in Meta-information page extension.",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="djangocms_page_meta_default_image",
to="filer.file",
),
),
],
options={
"verbose_name": "Default meta image",
"verbose_name_plural": "Default meta images",
},
),
]

View file

@ -0,0 +1,23 @@
# Generated by Django 4.2.4 on 2023-08-30 08:07
from django.db import migrations
def generate_default_meta_image_singleton(apps, schema_editor):
DefaultMetaImage = apps.get_model("djangocms_page_meta", "DefaultMetaImage")
DefaultMetaImage.objects.create()
def backwards(apps, schema_editor):
DefaultMetaImage = apps.get_model("djangocms_page_meta", "DefaultMetaImage")
DefaultMetaImage.objects.all().delete()
class Migration(migrations.Migration):
dependencies = [
("djangocms_page_meta", "0015_defaultmetaimage"),
]
operations = [
migrations.RunPython(generate_default_meta_image_singleton, backwards),
]

View file

@ -0,0 +1,28 @@
# Generated by Django 6.1.1 on 2026-10-01 14:16
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cms', '0045_pageurl_site_unique_path'),
('djangocms_page_meta', '0016_auto_20230830_1007'),
]
operations = [
migrations.RemoveField(
model_name='pagemeta',
name='public_extension',
),
migrations.RemoveField(
model_name='titlemeta',
name='public_extension',
),
migrations.AlterField(
model_name='titlemeta',
name='extended_object',
field=models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, to='cms.pagecontent'),
),
]

View file

231
vendor/djangocms_page_meta/models.py vendored Normal file
View file

@ -0,0 +1,231 @@
import ast
from cms.extensions import PageExtension, TitleExtension
from cms.extensions.extension_pool import extension_pool
from cms.models import Page, Title
from django.conf import settings
from django.core.cache import cache
from django.db import models
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _
from filer.fields.file import FilerFileField
from meta import settings as meta_settings
from .utils import get_cache_key, get_metatags
try:
from aldryn_snake.template_api import registry
except ImportError:
registry = None
class PageMeta(PageExtension):
image = FilerFileField(
null=True,
blank=True,
related_name="djangocms_page_meta_page",
help_text=_("Used if title image is empty."),
on_delete=models.CASCADE,
)
og_type = models.CharField(
_("Resource type"),
max_length=255,
choices=meta_settings.FB_TYPES,
blank=True,
help_text=_("Use Article for generic pages."),
)
og_author = models.ForeignKey(
settings.AUTH_USER_MODEL,
verbose_name=_("Author account"),
null=True,
blank=True,
on_delete=models.CASCADE,
)
og_author_url = models.CharField(_("Author Facebook URL"), max_length=255, default="", blank=True)
og_author_fbid = models.CharField(
_("Author Facebook ID"), max_length=16, default="", blank=True, help_text=_("Use Facebook numeric ID.")
)
og_publisher = models.CharField(_("Website Facebook URL"), max_length=255, default="", blank=True)
og_app_id = models.CharField(_("Facebook App ID"), max_length=255, default="", blank=True)
fb_pages = models.CharField(_("Facebook Pages ID"), max_length=255, default="", blank=True)
twitter_author = models.CharField(
_("Author Twitter Account"), max_length=255, default="", blank=True, help_text=_("'@' character not required.")
)
twitter_site = models.CharField(
_("Website Twitter Account"),
max_length=255,
default="",
blank=True,
help_text=_("'@' character not required."),
)
twitter_type = models.CharField(
_("Resource type"), max_length=255, choices=meta_settings.TWITTER_TYPES, blank=True
)
schemaorg_type = models.CharField(
_("Resource type"),
max_length=255,
choices=meta_settings.SCHEMAORG_TYPES,
blank=True,
help_text=_("Use Article for generic pages."),
)
robots = models.CharField(_("Robots meta tag"), max_length=512, blank=True)
class Meta:
verbose_name = _("Page meta info (all languages)")
verbose_name_plural = _("Page meta info (all languages)")
def __str__(self):
return _("Page Meta for {0}").format(self.extended_object)
def copy_relations(self, oldinstance, language):
# Remove old refs to prep for copying
self.extra.all().delete()
# Copy everyting to published page instance
for item in oldinstance.extra.all():
item.pk = None
item.page = self
item.save()
@property
def robots_list(self):
if self.robots:
return ast.literal_eval(self.robots)
return None
extension_pool.register(PageMeta)
class TitleMeta(TitleExtension):
image = FilerFileField(
null=True,
blank=True,
related_name="djangocms_page_meta_title",
help_text=_("If empty, page image will be used for all languages."),
on_delete=models.CASCADE,
)
keywords = models.CharField(max_length=2000, default="", blank=True)
description = models.CharField(max_length=2000, default="", blank=True)
og_description = models.CharField(_("Facebook Description"), max_length=2000, default="", blank=True)
twitter_description = models.CharField(_("Twitter Description"), max_length=2000, default="", blank=True)
schemaorg_name = models.CharField(
_("Schemaorg Name"), max_length=255, blank=True, help_text=_("Name of the item.")
)
schemaorg_description = models.CharField(
_("Schemaorg Description"), max_length=255, blank=True, help_text=_("Description of the item.")
)
class Meta:
verbose_name = _("Page meta info (language-dependent)")
verbose_name_plural = _("Page meta info (language-dependent)")
def __str__(self):
return _("Title Meta for {0}").format(self.extended_object)
@property
def locale(self):
if self.extended_object.language.find("_") > -1:
return self.extended_object.language
else:
return None
def copy_relations(self, oldinstance, language):
# Remove old refs to prep for copying
self.extra.all().delete()
# Copy everyting to published page instance
for item in oldinstance.extra.all():
item.pk = None
item.title = self
item.save()
extension_pool.register(TitleMeta)
class GenericMetaAttribute(models.Model):
DEFAULT_ATTRIBUTE = "name"
page = models.ForeignKey(PageMeta, null=True, blank=True, related_name="extra", on_delete=models.CASCADE)
title = models.ForeignKey(TitleMeta, null=True, blank=True, related_name="extra", on_delete=models.CASCADE)
attribute = models.CharField(
_("attribute"),
max_length=200,
help_text=_("Custom attribute"),
default="",
blank=True,
)
name = models.CharField(
_("name"),
max_length=200,
help_text=_("Meta attribute name"),
)
value = models.CharField(
_("value"),
max_length=2000,
help_text=_("Meta attribute value"),
)
class Meta:
verbose_name = _("Page meta info (language-dependent)")
verbose_name_plural = _("Page meta info (language-dependent)")
def __str__(self):
if self.page:
return _("Attribute {0} for {1}").format(self.name, self.page)
if self.title:
return _("Attribute {0} for {1}").format(self.name, self.title)
class DefaultMetaImage(models.Model):
image = FilerFileField(
null=True,
blank=True,
related_name="djangocms_page_meta_default_image",
help_text=_(
"Default image for og:image, twitter:image and schema.org image.\n"
"You can override this by setting the image in Meta-information page extension."
),
on_delete=models.SET_NULL,
)
class Meta:
verbose_name = _("Default meta image")
verbose_name_plural = _("Default meta images")
def __str__(self):
return self.image.label if self.image else str(self.pk)
# Cache cleanup when deleting pages / editing page extensions
@receiver(pre_delete, sender=Page)
def cleanup_page(sender, instance, **kwargs):
for language in instance.get_languages():
key = get_cache_key(instance, language)
cache.delete(key)
@receiver(pre_delete, sender=Title)
def cleanup_title(sender, instance, **kwargs):
key = get_cache_key(instance.page, instance.language)
cache.delete(key)
@receiver(post_save, sender=PageMeta)
@receiver(pre_delete, sender=PageMeta)
def cleanup_pagemeta(sender, instance, **kwargs):
for language in instance.extended_object.get_languages():
key = get_cache_key(instance.extended_object, language)
cache.delete(key)
@receiver(post_save, sender=TitleMeta)
@receiver(pre_delete, sender=TitleMeta)
def cleanup_titlemeta(sender, instance, **kwargs):
key = get_cache_key(instance.extended_object.page, instance.extended_object.language)
cache.delete(key)
if registry:
registry.add_to_head(get_metatags)

27
vendor/djangocms_page_meta/settings.py vendored Normal file
View file

@ -0,0 +1,27 @@
from django.utils.translation import gettext_lazy as _
def get_setting(name):
from django.conf import settings
description_length = getattr(settings, "PAGE_META_DESCRIPTION_LENGTH", None) or 320
tw_description_length = getattr(settings, "PAGE_META_TWITTER_DESCRIPTION_LENGTH", None) or 320
robots_choices = getattr(settings, "PAGE_META_ROBOTS_CHOICES", None) or (
("none", _("None [noindex, nofollow]")),
("noindex", _("No Index")),
("nofollow", _("No Follow")),
("noimageindex", _("No Image Index")),
("nosnippet", _("No Snippet")),
("noarchive", _("No Archive")),
("notranslate", _("No Translate")),
("nositelinkssearchbox", _("No Site Links Search Box")),
)
default = {
"PAGE_META_DESCRIPTION_LENGTH": description_length,
"PAGE_META_TWITTER_DESCRIPTION_LENGTH": tw_description_length,
"PAGE_META_ROBOTS_CHOICES": robots_choices,
}
return default["PAGE_META_%s" % name]

View file

@ -0,0 +1,3 @@
#content .module h2:first-child {
display: block;
}

View file

@ -0,0 +1,50 @@
{% load meta_extra %}
{% if meta %}
{% autoescape off %}
{% if meta.description %}{% meta 'description' meta.description %}{% endif %}
{% if meta.keywords %}{% meta_list 'keywords' meta.keywords %}{% endif %}
{% if meta.use_og %}
{% if meta.title %}{% og_prop 'title' meta.title %}{% endif %}
{% if meta.url %}{% og_prop 'url' meta.url %}{% endif %}
{% if meta.og_description %}{% og_prop 'description' meta.og_description %}{% endif %}
{% if meta.image %}{% og_prop 'image' meta.image %}{% endif %}
{% if meta.og_type %}{% og_prop 'type' meta.og_type %}{% endif %}
{% if meta.site_name %}{% og_prop 'site_name' meta.site_name %}{% endif %}
{% if meta.og_author_url %}
{% generic_prop 'article' 'author' meta.og_author_url %}
{% elif meta.og_author %}
{% generic_prop 'article' 'author:first_name' meta.og_author.first_name %}
{% generic_prop 'article' 'author:last_name' meta.og_author.last_name %}
{% endif %}
{% if meta.published_time %}{% generic_prop 'article' 'published_time' meta.published_time %}{% endif %}
{% if meta.modified_time %}{% generic_prop 'article' 'modified_time' meta.modified_time %}{% endif %}
{% if meta.expiration_time %}{% generic_prop 'article' 'expiration_time' meta.expiration_time %}{% endif %}
{% if meta.og_publisher %}{% generic_prop 'article' 'publisher' meta.og_publisher %}{% endif %}
{% if meta.og_app_id %}{% generic_prop 'fb' 'app_id' meta.og_app_id %}{% endif %}
{% if meta.og_profile_id %}{% generic_prop 'fb' 'profile_id' meta.og_profile_id %}{% endif %}
{% if meta.fb_pages %}{% generic_prop 'fb' 'pages' meta.fb_pages %}{% endif %}
{% if meta.tag %}{% generic_prop 'article' 'tag' meta.tag %}{% endif %}
{% if meta.locale %}{% og_prop 'locale' meta.locale %}{% endif %}
{% endif %}
{% if meta.use_twitter %}
{% twitter_prop 'domain' meta.get_domain %}
{% if meta.twitter_type %}{% twitter_prop 'card' meta.twitter_type %}{% endif %}
{% if meta.title %}{% twitter_prop 'title' meta.title %}{% endif %}
{% if meta.url %}{% twitter_prop 'url' meta.url %}{% endif %}
{% if meta.twitter_description %}{% twitter_prop 'description' meta.twitter_description %}{% endif %}
{% if meta.image %}{% twitter_prop 'image:src' meta.image %}{% endif %}
{% if meta.twitter_author %}{% twitter_prop 'creator' meta.twitter_author %}{% endif %}
{% if meta.twitter_site %}{% twitter_prop 'site_name' meta.twitter_site %}{% endif %}
{% endif %}
{% if meta.robots %}{% meta_list 'robots' meta.robots %}{% endif %}
{% if meta.use_schemaorg %}
{% if meta.schemaorg_name %}{% schemaorg_prop 'name' meta.schemaorg_name %}{% endif %}
{% if meta.schemaorg_datePublished %}{% schemaorg_prop 'datePublished' meta.schemaorg_datePublished %}{% endif %}
{% if meta.schemaorg_dateModified %}{% schemaorg_prop 'dateModified' meta.schemaorg_dateModified %}{% endif %}
{% if meta.schemaorg_description %}{% schemaorg_prop 'description' meta.schemaorg_description %}{% endif %}
{% if meta.schemaorg_image %}{% schemaorg_prop 'image' meta.schemaorg_image %}{% endif %}
{% if meta.schemaorg_url %}{% schemaorg_prop 'url' meta.schemaorg_url %}{% endif %}
{% endif %}
{% custom_meta_extras meta.extra_custom_props %}
{% endautoescape %}
{% endif %}

View file

View file

@ -0,0 +1,29 @@
from classytags.arguments import Argument
from classytags.core import Options, Tag
from cms.utils import get_language_from_request
from django import template
from meta.views import Meta
from ..utils import get_page_meta
register = template.Library()
@register.tag(name="page_meta")
class MetaFromPage(Tag):
name = "page_meta"
options = Options(
Argument("page"),
"as",
Argument("varname", required=True, resolve=False),
)
def render_tag(self, context, page, varname):
request = context.get("request")
if request:
language = get_language_from_request(request)
meta = get_page_meta(page, language)
else:
meta = Meta()
context[varname] = meta
return ""

155
vendor/djangocms_page_meta/utils.py vendored Normal file
View file

@ -0,0 +1,155 @@
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
from django.utils.translation import get_language_from_request
from meta import settings as meta_settings
def get_cache_key(page, language):
"""
Create the cache key for the current page and language
"""
from cms.cache import _get_cache_key
try:
site_id = page.node.site_id
except AttributeError: # CMS_3_4
site_id = page.site_id
return _get_cache_key("page_meta", page, language, site_id)
def get_page_meta(page, language):
"""
Retrieves all the meta information for the page in the given language
:param page: a Page instance
:param lang: a language code
:return: Meta instance
:type: object
"""
from django.core.cache import cache
from meta.views import Meta
from .models import DefaultMetaImage, PageMeta, TitleMeta
try:
meta_key = get_cache_key(page, language)
except AttributeError:
return None
meta = cache.get(meta_key)
if not meta:
meta = Meta()
title = page.get_title_obj(language)
default_meta_image = DefaultMetaImage.objects.first().image
meta.extra_custom_props = []
meta.title = page.get_page_title(language)
if not meta.title:
meta.title = page.get_title(language)
if title.meta_description:
meta.description = title.meta_description.strip()
try:
titlemeta = title.titlemeta
if titlemeta.description:
meta.description = titlemeta.description.strip()
if titlemeta.keywords:
meta.keywords = titlemeta.keywords.strip().split(",")
meta.locale = titlemeta.locale
meta.og_description = titlemeta.og_description.strip()
if not meta.og_description:
meta.og_description = meta.description
meta.twitter_description = titlemeta.twitter_description.strip()
if not meta.twitter_description:
meta.twitter_description = meta.description
if titlemeta.image:
meta.image = title.titlemeta.image.canonical_url or title.titlemeta.image.url
meta.schemaorg_description = titlemeta.schemaorg_description.strip()
if not meta.schemaorg_description:
meta.schemaorg_description = meta.description
meta.schemaorg_name = titlemeta.schemaorg_name
if not meta.schemaorg_name:
meta.schemaorg_name = meta.title
for item in titlemeta.extra.all():
attribute = item.attribute
if not attribute:
attribute = item.DEFAULT_ATTRIBUTE
meta.extra_custom_props.append((attribute, item.name, item.value))
except (TitleMeta.DoesNotExist, AttributeError):
# Skipping title-level metas
if meta.description:
meta.og_description = meta.description
meta.schemaorg_description = meta.description
meta.twitter_description = meta.description
defaults = {
"object_type": meta_settings.get_setting("FB_TYPE"),
"og_type": meta_settings.get_setting("FB_TYPE"),
"og_app_id": meta_settings.get_setting("FB_APPID"),
"fb_pages": meta_settings.get_setting("FB_PAGES"),
"og_profile_id": meta_settings.get_setting("FB_PROFILE_ID"),
"og_publisher": meta_settings.get_setting("FB_PUBLISHER"),
"og_author_url": meta_settings.get_setting("FB_AUTHOR_URL"),
"twitter_type": meta_settings.get_setting("TWITTER_TYPE"),
"twitter_site": meta_settings.get_setting("TWITTER_SITE"),
"twitter_author": meta_settings.get_setting("TWITTER_AUTHOR"),
"schemaorg_type": meta_settings.get_setting("SCHEMAORG_TYPE"),
"schemaorg_datePublished": page.publication_date.isoformat() if page.publication_date else None,
"schemaorg_dateModified": page.changed_date.isoformat() if page.changed_date else None,
}
try:
pagemeta = page.pagemeta
meta.object_type = pagemeta.og_type
meta.og_type = pagemeta.og_type
meta.og_app_id = pagemeta.og_app_id
meta.fb_pages = pagemeta.fb_pages
meta.og_profile_id = pagemeta.og_author_fbid
meta.twitter_type = pagemeta.twitter_type
meta.twitter_site = pagemeta.twitter_site
meta.twitter_author = pagemeta.twitter_author
meta.schemaorg_type = pagemeta.schemaorg_type
meta.robots = pagemeta.robots_list
if page.publication_date:
meta.published_time = page.publication_date.isoformat()
if page.changed_date:
meta.modified_time = page.changed_date.isoformat()
if page.publication_end_date:
meta.expiration_time = page.publication_end_date.isoformat()
if meta.og_type == "article":
meta.og_publisher = pagemeta.og_publisher
meta.og_author_url = pagemeta.og_author_url
try:
from djangocms_page_tags.utils import get_page_tags, get_title_tags
tags = list(get_title_tags(page, language))
tags += list(get_page_tags(page))
meta.tag = ",".join([tag.name for tag in tags])
except ImportError:
# djangocms-page-tags not available
pass
if not meta.image and pagemeta.image:
meta.image = pagemeta.image.canonical_url or pagemeta.image.url
for item in pagemeta.extra.all():
attribute = item.attribute
if not attribute:
attribute = item.DEFAULT_ATTRIBUTE
meta.extra_custom_props.append((attribute, item.name, item.value))
except PageMeta.DoesNotExist:
pass
for attr, val in defaults.items():
if not getattr(meta, attr, "") and val:
setattr(meta, attr, val)
if not meta.image and default_meta_image:
meta.image = default_meta_image.canonical_url or default_meta_image.url
meta.url = page.get_absolute_url(language)
meta.schemaorg_url = meta.url
meta.schemaorg_image = meta.image
cache.set(meta_key, meta)
return meta
def get_metatags(request):
language = get_language_from_request(request, check_path=True)
meta = get_page_meta(request.current_page, language)
return mark_safe(
render_to_string(request=request, template_name="djangocms_page_meta/meta.html", context={"meta": meta})
)