Source code for shoop.xtheme.plugins.social_media_links

# -*- coding: utf-8 -*-
# This file is part of Shoop.
#
# Copyright (c) 2012-2016, Shoop Ltd. All rights reserved.
#
# This source code is licensed under the AGPLv3 license found in the
# LICENSE file in the root directory of this source tree.
import re
from collections import defaultdict

from django import forms
from django.utils.translation import ugettext_lazy as _

from shoop.xtheme import TemplatedPlugin
from shoop.xtheme.plugins.forms import GenericPluginForm, TranslatableField


[docs]class SocialMediaLinksPluginForm(GenericPluginForm): """ Form for the social media links xtheme plugin. One field is provided for each entry in the plugin's icon_classes attribute, which maps social media site names to font-awesome icon classes by default. """
[docs] def populate(self): """ Populates form with default plugin fields as well as any social media link type included in the plugin's ``icon_classes`` attribute. Also adds an ordering field for each link type to change display order. """ icon_classes = self.plugin.icon_classes links = self.plugin.config.get("links", {}) for name, icon_class in sorted(icon_classes.items()): url = links[name]["url"] if name in links else "" ordering = links[name]["ordering"] if name in links else None self.fields[name] = forms.URLField( label=name, required=False, widget=forms.TextInput(attrs={"placeholder": "URL"}), initial=url) self.fields["%s-ordering" % name] = forms.IntegerField( label="", required=False, min_value=0, max_value=len(icon_classes)*2, initial=ordering, widget=forms.NumberInput(attrs={"placeholder": "Ordering"})) super(SocialMediaLinksPluginForm, self).populate()
[docs] def clean(self): """ Returns cleaned data from default plugin fields and any link fields. Processed link configuration information is stored and returned as a dictionary (``links``). """ links_dict = defaultdict(dict) cleaned_data = {} precleaned_data = super(SocialMediaLinksPluginForm, self).clean() plugin_fields = [field for (field, value) in self.plugin.fields] for field in plugin_fields: cleaned_data[field] = precleaned_data.pop(field) for link_info in precleaned_data: link_name = re.sub("-ordering", "", link_info) if not link_info.endswith("-ordering"): links_dict[link_name]["url"] = precleaned_data[link_info] else: links_dict[link_name]["ordering"] = precleaned_data[link_info] cleaned_data["links"] = {k: v for (k, v) in links_dict.items() if v.get("url", None)} return cleaned_data
[docs]class SocialMediaLinksPlugin(TemplatedPlugin): """ An xtheme plugin for displaying site links to common social media sites. """ identifier = "social_media_links" name = _("Social Media Links") template_name = "shoop/xtheme/plugins/social_media_links.jinja" editor_form_class = SocialMediaLinksPluginForm fields = [ ("topic", TranslatableField(label=_("Topic"), required=False, initial="")), ("text", TranslatableField(label=_("Title"), required=False, initial="")), ("icon_size", forms.ChoiceField(label=_("Icon Size"), required=False, choices=[ ("", "Default"), ("lg", "Large"), ("2x", "2x"), ("3x", "3x"), ("4x", "4x"), ("5x", "5x"), ], initial="")), ("alignment", forms.ChoiceField(label=_("Alignment"), required=False, choices=[ ("", "Default"), ("left", "Left"), ("center", "Center"), ("right", "Right"), ], initial="")), ] icon_classes = { "Facebook": "facebook-square", "Flickr": "flickr", "Google Plus": "google-plus-square", "Instagram": "instagram", "Linkedin": "linkedin-square", "Pinterest": "pinterest", "Tumbler": "tumblr", "Twitter": "twitter", "Vimeo": "vimeo", "Vine": "vine", "Yelp": "yelp", "Youtube": "youtube", }
[docs] def get_context_data(self, context): """ Returns plugin settings and a sorted list of social media links :return: Plugin context data :rtype: dict """ links = self.get_links() return { "links": links, "request": context["request"], "topic": self.get_translated_value("topic"), "text": self.get_translated_value("text"), "icon_size": self.config.get("icon_size", ""), "alignment": self.config.get("alignment", ""), }