diff --git a/cms/utils/permissions.py b/cms/utils/permissions.py index 67ec7b54..96ec5300 100644 --- a/cms/utils/permissions.py +++ b/cms/utils/permissions.py @@ -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, + ) \ No newline at end of file diff --git a/datacenterlight/cms_models.py b/datacenterlight/cms_models.py index dcd88f42..e5a4fb86 100644 --- a/datacenterlight/cms_models.py +++ b/datacenterlight/cms_models.py @@ -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+' ) diff --git a/datacenterlight/migrations/0012_dclcalculatorpluginmodel.py b/datacenterlight/migrations/0012_dclcalculatorpluginmodel.py index 1aa492af..51c4732b 100644 --- a/datacenterlight/migrations/0012_dclcalculatorpluginmodel.py +++ b/datacenterlight/migrations/0012_dclcalculatorpluginmodel.py @@ -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'), ] diff --git a/djangocms_blog/migrations/0014_auto_20160215_1331.py b/djangocms_blog/migrations/0014_auto_20160215_1331.py index bc14a74d..7a9719e8 100644 --- a/djangocms_blog/migrations/0014_auto_20160215_1331.py +++ b/djangocms_blog/migrations/0014_auto_20160215_1331.py @@ -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), - ] + ] \ No newline at end of file diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py index 44ed7c71..13a4428a 100644 --- a/dynamicweb/settings/base.py +++ b/dynamicweb/settings/base.py @@ -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', diff --git a/dynamicweb/settings/local.py b/dynamicweb/settings/local.py index 4ea3dc7e..4c630670 100644 --- a/dynamicweb/settings/local.py +++ b/dynamicweb/settings/local.py @@ -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' ) diff --git a/dynamicweb/settings/prod.py b/dynamicweb/settings/prod.py index a8580cdd..e419e962 100644 --- a/dynamicweb/settings/prod.py +++ b/dynamicweb/settings/prod.py @@ -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", ] diff --git a/hosting/migrations/0026_auto_20160625_0028.py b/hosting/migrations/0026_auto_20160625_0028.py index 7f98eea9..f4b37ef8 100644 --- a/hosting/migrations/0026_auto_20160625_0028.py +++ b/hosting/migrations/0026_auto_20160625_0028.py @@ -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={}, ), ] diff --git a/hosting/migrations/0027_auto_20160711_0210.py b/hosting/migrations/0027_auto_20160711_0210.py index 4644942c..a35d32ec 100644 --- a/hosting/migrations/0027_auto_20160711_0210.py +++ b/hosting/migrations/0027_auto_20160711_0210.py @@ -14,6 +14,6 @@ class Migration(migrations.Migration): operations = [ migrations.AlterModelOptions( name='hostingorder', - options={'permissions': (('view_hostingorder', 'View Hosting Order'),)}, + options={}, ), ] diff --git a/hosting/migrations/0030_hostingbill.py b/hosting/migrations/0030_hostingbill.py index edb01aed..cf71e158 100644 --- a/hosting/migrations/0030_hostingbill.py +++ b/hosting/migrations/0030_hostingbill.py @@ -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), ), diff --git a/hosting/migrations/0046_usercarddetail.py b/hosting/migrations/0046_usercarddetail.py index 97c1e94a..952685a8 100644 --- a/hosting/migrations/0046_usercarddetail.py +++ b/hosting/migrations/0046_usercarddetail.py @@ -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), ), diff --git a/hosting/migrations/0050_monthlyhostingbill.py b/hosting/migrations/0050_monthlyhostingbill.py index 34d29e68..53bd77bb 100644 --- a/hosting/migrations/0050_monthlyhostingbill.py +++ b/hosting/migrations/0050_monthlyhostingbill.py @@ -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), ), diff --git a/hosting/migrations/0052_hostingbilllineitem.py b/hosting/migrations/0052_hostingbilllineitem.py index 6f1a3db4..c07b424e 100644 --- a/hosting/migrations/0052_hostingbilllineitem.py +++ b/hosting/migrations/0052_hostingbilllineitem.py @@ -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), ), diff --git a/manage.py b/manage.py index 12272536..662d4c15 100755 --- a/manage.py +++ b/manage.py @@ -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") diff --git a/membership/migrations/0008_change_user_id_to_customer_id_in_djangocms_blog.py b/membership/migrations/0008_change_user_id_to_customer_id_in_djangocms_blog.py index 4a8530e9..7fa22545 100644 --- a/membership/migrations/0008_change_user_id_to_customer_id_in_djangocms_blog.py +++ b/membership/migrations/0008_change_user_id_to_customer_id_in_djangocms_blog.py @@ -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 + $$; + """, + ), ] diff --git a/old_requirements.txt b/old_requirements.txt new file mode 100644 index 00000000..73cdf987 --- /dev/null +++ b/old_requirements.txt @@ -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 diff --git a/requirements.txt b/requirements.txt index 73cdf987..491a02bc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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 diff --git a/updated_requirements.txt b/updated_requirements.txt deleted file mode 100644 index 491a02bc..00000000 --- a/updated_requirements.txt +++ /dev/null @@ -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 diff --git a/utils/middleware.py b/utils/middleware.py index 980cc092..e0b675aa 100644 --- a/utils/middleware.py +++ b/utils/middleware.py @@ -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 \ No newline at end of file diff --git a/vendor/djangocms_page_meta/__init__.py b/vendor/djangocms_page_meta/__init__.py new file mode 100644 index 00000000..97946ec7 --- /dev/null +++ b/vendor/djangocms_page_meta/__init__.py @@ -0,0 +1,2 @@ +__version__ = "1.4.5" +__author__ = "Iacopo Spalletti " diff --git a/vendor/djangocms_page_meta/admin.py b/vendor/djangocms_page_meta/admin.py new file mode 100644 index 00000000..8b7a3f8f --- /dev/null +++ b/vendor/djangocms_page_meta/admin.py @@ -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 diff --git a/vendor/djangocms_page_meta/apps.py b/vendor/djangocms_page_meta/apps.py new file mode 100644 index 00000000..39f76dfb --- /dev/null +++ b/vendor/djangocms_page_meta/apps.py @@ -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" diff --git a/vendor/djangocms_page_meta/cms_toolbars.py b/vendor/djangocms_page_meta/cms_toolbars.py new file mode 100644 index 00000000..468fdf70 --- /dev/null +++ b/vendor/djangocms_page_meta/cms_toolbars.py @@ -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) diff --git a/vendor/djangocms_page_meta/forms.py b/vendor/djangocms_page_meta/forms.py new file mode 100644 index 00000000..78726921 --- /dev/null +++ b/vendor/djangocms_page_meta/forms.py @@ -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 = () diff --git a/vendor/djangocms_page_meta/locale/ar/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/ar/LC_MESSAGES/django.po new file mode 100644 index 00000000..9e34ea45 --- /dev/null +++ b/vendor/djangocms_page_meta/locale/ar/LC_MESSAGES/django.po @@ -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 \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" diff --git a/vendor/djangocms_page_meta/locale/bg/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 00000000..3e2a2114 --- /dev/null +++ b/vendor/djangocms_page_meta/locale/bg/LC_MESSAGES/django.po @@ -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 \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" diff --git a/vendor/djangocms_page_meta/locale/de/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/de/LC_MESSAGES/django.po new file mode 100644 index 00000000..03620100 --- /dev/null +++ b/vendor/djangocms_page_meta/locale/de/LC_MESSAGES/django.po @@ -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 , 2016-2017 +# djangoger , 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 \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" diff --git a/vendor/djangocms_page_meta/locale/en/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/en/LC_MESSAGES/django.po new file mode 100644 index 00000000..5aac9bf1 --- /dev/null +++ b/vendor/djangocms_page_meta/locale/en/LC_MESSAGES/django.po @@ -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 \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" diff --git a/vendor/djangocms_page_meta/locale/es/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/es/LC_MESSAGES/django.po new file mode 100644 index 00000000..b668e727 --- /dev/null +++ b/vendor/djangocms_page_meta/locale/es/LC_MESSAGES/django.po @@ -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 , 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 \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" diff --git a/vendor/djangocms_page_meta/locale/it/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/it/LC_MESSAGES/django.po new file mode 100644 index 00000000..ab95bccb --- /dev/null +++ b/vendor/djangocms_page_meta/locale/it/LC_MESSAGES/django.po @@ -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 , 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 \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" diff --git a/vendor/djangocms_page_meta/locale/lt/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 00000000..1b614a27 --- /dev/null +++ b/vendor/djangocms_page_meta/locale/lt/LC_MESSAGES/django.po @@ -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 , 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 \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" diff --git a/vendor/djangocms_page_meta/locale/pt_BR/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 00000000..95d425fb --- /dev/null +++ b/vendor/djangocms_page_meta/locale/pt_BR/LC_MESSAGES/django.po @@ -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 \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" diff --git a/vendor/djangocms_page_meta/locale/ru/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 00000000..13eefb25 --- /dev/null +++ b/vendor/djangocms_page_meta/locale/ru/LC_MESSAGES/django.po @@ -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 , 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 \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" diff --git a/vendor/djangocms_page_meta/locale/tr/LC_MESSAGES/django.po b/vendor/djangocms_page_meta/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 00000000..a276c3e8 --- /dev/null +++ b/vendor/djangocms_page_meta/locale/tr/LC_MESSAGES/django.po @@ -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 , 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 \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" diff --git a/vendor/djangocms_page_meta/migrations/0001_initial.py b/vendor/djangocms_page_meta/migrations/0001_initial.py new file mode 100644 index 00000000..137cefba --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0001_initial.py @@ -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,), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0002_auto_20150807_0936.py b/vendor/djangocms_page_meta/migrations/0002_auto_20150807_0936.py new file mode 100644 index 00000000..ce2fb00c --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0002_auto_20150807_0936.py @@ -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, + ), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0003_auto_20151220_1734.py b/vendor/djangocms_page_meta/migrations/0003_auto_20151220_1734.py new file mode 100644 index 00000000..43e39eaf --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0003_auto_20151220_1734.py @@ -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, + ), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0004_auto_20160409_1852.py b/vendor/djangocms_page_meta/migrations/0004_auto_20160409_1852.py new file mode 100644 index 00000000..1f16a5ba --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0004_auto_20160409_1852.py @@ -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"), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0005_pagemeta_fb_pages.py b/vendor/djangocms_page_meta/migrations/0005_pagemeta_fb_pages.py new file mode 100644 index 00000000..68c8cb30 --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0005_pagemeta_fb_pages.py @@ -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"), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0006_auto_20160423_1859.py b/vendor/djangocms_page_meta/migrations/0006_auto_20160423_1859.py new file mode 100644 index 00000000..8898a8c1 --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0006_auto_20160423_1859.py @@ -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, + ), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0007_auto_20160530_2257.py b/vendor/djangocms_page_meta/migrations/0007_auto_20160530_2257.py new file mode 100644 index 00000000..d0e2a66d --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0007_auto_20160530_2257.py @@ -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"), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0008_auto_20160609_0754.py b/vendor/djangocms_page_meta/migrations/0008_auto_20160609_0754.py new file mode 100644 index 00000000..4d75ce81 --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0008_auto_20160609_0754.py @@ -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(), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0009_auto_20171230_1954.py b/vendor/djangocms_page_meta/migrations/0009_auto_20171230_1954.py new file mode 100644 index 00000000..7acd56ca --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0009_auto_20171230_1954.py @@ -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", + ), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0010_auto_20180108_2316.py b/vendor/djangocms_page_meta/migrations/0010_auto_20180108_2316.py new file mode 100644 index 00000000..c5247bdb --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0010_auto_20180108_2316.py @@ -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"), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0011_auto_20190218_1010.py b/vendor/djangocms_page_meta/migrations/0011_auto_20190218_1010.py new file mode 100644 index 00000000..1644705c --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0011_auto_20190218_1010.py @@ -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", + ), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0012_auto_20200706_1230.py b/vendor/djangocms_page_meta/migrations/0012_auto_20200706_1230.py new file mode 100644 index 00000000..fbf0be8e --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0012_auto_20200706_1230.py @@ -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" + ), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0013_auto_20200821_1457.py b/vendor/djangocms_page_meta/migrations/0013_auto_20200821_1457.py new file mode 100644 index 00000000..7e1d9b7a --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0013_auto_20200821_1457.py @@ -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", + ), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0014_pagemeta_robots_alter_genericmetaattribute_id_and_more.py b/vendor/djangocms_page_meta/migrations/0014_pagemeta_robots_alter_genericmetaattribute_id_and_more.py new file mode 100644 index 00000000..a41a6f61 --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0014_pagemeta_robots_alter_genericmetaattribute_id_and_more.py @@ -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"), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0015_defaultmetaimage.py b/vendor/djangocms_page_meta/migrations/0015_defaultmetaimage.py new file mode 100644 index 00000000..1323d707 --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0015_defaultmetaimage.py @@ -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", + }, + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/0016_auto_20230830_1007.py b/vendor/djangocms_page_meta/migrations/0016_auto_20230830_1007.py new file mode 100644 index 00000000..cbb67700 --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0016_auto_20230830_1007.py @@ -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), + ] diff --git a/vendor/djangocms_page_meta/migrations/0017_remove_pagemeta_public_extension_and_more.py b/vendor/djangocms_page_meta/migrations/0017_remove_pagemeta_public_extension_and_more.py new file mode 100644 index 00000000..af8d2160 --- /dev/null +++ b/vendor/djangocms_page_meta/migrations/0017_remove_pagemeta_public_extension_and_more.py @@ -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'), + ), + ] diff --git a/vendor/djangocms_page_meta/migrations/__init__.py b/vendor/djangocms_page_meta/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/djangocms_page_meta/models.py b/vendor/djangocms_page_meta/models.py new file mode 100644 index 00000000..0b6f6e54 --- /dev/null +++ b/vendor/djangocms_page_meta/models.py @@ -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) diff --git a/vendor/djangocms_page_meta/settings.py b/vendor/djangocms_page_meta/settings.py new file mode 100644 index 00000000..1da44db8 --- /dev/null +++ b/vendor/djangocms_page_meta/settings.py @@ -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] diff --git a/vendor/djangocms_page_meta/static/djangocms_page_meta/css/djangocms_page_meta_admin.css b/vendor/djangocms_page_meta/static/djangocms_page_meta/css/djangocms_page_meta_admin.css new file mode 100644 index 00000000..4f3cd2a9 --- /dev/null +++ b/vendor/djangocms_page_meta/static/djangocms_page_meta/css/djangocms_page_meta_admin.css @@ -0,0 +1,3 @@ +#content .module h2:first-child { + display: block; +} diff --git a/vendor/djangocms_page_meta/templates/djangocms_page_meta/meta.html b/vendor/djangocms_page_meta/templates/djangocms_page_meta/meta.html new file mode 100644 index 00000000..c197e143 --- /dev/null +++ b/vendor/djangocms_page_meta/templates/djangocms_page_meta/meta.html @@ -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 %} diff --git a/vendor/djangocms_page_meta/templatetags/__init__.py b/vendor/djangocms_page_meta/templatetags/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/djangocms_page_meta/templatetags/page_meta_tags.py b/vendor/djangocms_page_meta/templatetags/page_meta_tags.py new file mode 100644 index 00000000..07d7e7d6 --- /dev/null +++ b/vendor/djangocms_page_meta/templatetags/page_meta_tags.py @@ -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 "" diff --git a/vendor/djangocms_page_meta/utils.py b/vendor/djangocms_page_meta/utils.py new file mode 100644 index 00000000..cf95645b --- /dev/null +++ b/vendor/djangocms_page_meta/utils.py @@ -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}) + )