from copy import deepcopy
from mezzanine.core.admin import *
from mezzanine.pages.admin import PageAdmin
-from orderable.admin import OrderableAdmin, OrderableTabularInline
-from organization.magazine.models import Article, Brief, Topic, ArticleImage
+#from orderable.admin import OrderableTabularInline #OrderableAdmin,
+from organization.magazine.models import Article, Brief, Topic, ArticleImage, BriefForm
class ArticleImageInline(TabularDynamicInlineAdmin):
inlines = [ArticleImageInline,]
-class BriefAdmin(OrderableTabularInline):
+class BriefAdmin(admin.ModelAdmin): #OrderableTabularInline
model = Brief
-class BriefAdminDisplayable(BaseTranslationModelAdmin, OrderableAdmin):
+class BriefAdminDisplayable(BaseTranslationModelAdmin,): #, OrderableAdmin
- list_display = ('title', 'local_content', 'sort_order_display',)
+ #list_display = ('title', 'local_content', 'sort_order_display',)
+ form = BriefForm
fieldsets = deepcopy(BriefAdmin.fieldsets)
+ # form = BriefForm
+ # form = autocomplete_light.modelform_factory(Brief)
+
admin.site.register(Article, ArticleAdminDisplayable)
admin.site.register(Brief, BriefAdminDisplayable)
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-08-12 15:38
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('contenttypes', '0002_remove_content_type_name'),
+ ('organization-magazine', '0011_articleimage'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='TestModel',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200)),
+ ('object_id', models.PositiveIntegerField(blank=True, editable=False, null=True)),
+ ('content_type', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
+ ],
+ ),
+ migrations.AddField(
+ model_name='brief',
+ name='content_type',
+ field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'),
+ ),
+ migrations.AddField(
+ model_name='brief',
+ name='object_id',
+ field=models.PositiveIntegerField(blank=True, editable=False, null=True),
+ ),
+ ]
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-08-12 16:13
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('organization-magazine', '0012_auto_20160812_1738'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='testmodel',
+ name='content_type',
+ ),
+ migrations.AlterField(
+ model_name='brief',
+ name='content_type',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='content page'),
+ ),
+ migrations.AlterField(
+ model_name='brief',
+ name='object_id',
+ field=models.PositiveIntegerField(null=True, verbose_name='related object'),
+ ),
+ migrations.DeleteModel(
+ name='TestModel',
+ ),
+ ]
from __future__ import unicode_literals
from django.db import models
+from django import forms
+from django.contrib.contenttypes.fields import GenericForeignKey
+from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse, reverse_lazy
+from dal import autocomplete
from mezzanine.core.models import RichText, Displayable, Slugged
from mezzanine.pages.models import Page
from mezzanine.blog.models import BlogPost
-from orderable.models import Orderable
+#from orderable.models import Orderable
+# from autocomplete.dal_queryset_sequence.fields import (
+# QuerySetSequenceModelField,
+# QuerySetSequenceModelMultipleField,
+# )
from organization.core.models import Named, Description, Image
from organization.media.models import Photo
-
class ArticleImage(Image):
article_fk = models.ForeignKey("Article", verbose_name=_('article'))
verbose_name = _('article')
-class Brief(Displayable, RichText, Orderable):
+class Brief(Displayable, RichText): #Orderable
text_button = models.CharField(blank=True, max_length=150, null=False, verbose_name='text button')
local_content = models.URLField(blank=False, max_length=1000, null=False, verbose_name='local content')
+ limit = models.Q(app_label='organization-magazine', model='article') | \
+ models.Q(app_label='organization-magazine', model='topic')
+ content_type = models.ForeignKey(
+ ContentType,
+ verbose_name=_('content page'),
+ limit_choices_to=limit,
+ null=True,
+ blank=True,
+ )
+ object_id = models.PositiveIntegerField(
+ verbose_name=_('related object'),
+ null=True,
+ )
+ content_object = GenericForeignKey('content_type', 'object_id')
+
+
def get_absolute_url(self):
return self.local_content
class Meta:
verbose_name = _('brief')
- ordering = ['sort_order']
+ #ordering = ['sort_order']
+
+
+
+# class BriefForm(forms.ModelForm):
+#
+# selected_object = forms.ModelChoiceField(
+# queryset=ContentType.objects.all(),
+# widget=autocomplete.ModelSelect2(url='object-autocomplete')
+# )
+#
+# class Meta:
+# model = Brief
+# fields = ('__all__')
+
+class BriefForm(autocomplete.FutureModelForm):
+
+ selected_object = forms.ModelChoiceField(
+ queryset=ContentType.objects.all(),
+ widget=autocomplete.ModelSelect2(url='object-autocomplete')
+ )
+
+ # content_object = autocomplete.QuerySetSequenceModelField(
+ # queryset=autocomplete.QuerySetSequence(
+ # #Article.objects.all(),
+ # #Topic.objects.all(),
+ # #ContentType.objects.all(),
+ # ),
+ # required=False,
+ # widget=autocomplete.QuerySetSequenceSelect2('object-autocomplete'),
+ # )
+
+ class Meta:
+ model = Brief
+ fields = ('__all__')
+
class Topic(Page, RichText):
"""Topic for magazine menu"""
url("^article/$", ArticleListView.as_view(), name="magazine-article-list"),
url("^article/detail/(?P<slug>.*)%s$" % _slash, ArticleDetailView.as_view(), name="magazine-article-detail"),
url("^topic/detail/(?P<slug>.*)%s$" % _slash, TopicDetailView.as_view(), name='topic-detail'),
+ url(
+ r'^object-autocomplete/$',
+ ObjectAutocomplete.as_view(),
+ name='object-autocomplete',
+ ),
]
from django.utils import timezone
#from django.views.generic import *
from django.views.generic import DetailView, ListView, TemplateView
+from django.contrib.contenttypes.models import ContentType
from django.views.generic.base import *
from django.shortcuts import get_object_or_404
+from itertools import chain
+from dal import autocomplete
from organization.magazine.models import Article, Topic, Brief
from organization.team.models import Department
def get_context_data(self, **kwargs):
context = super(TopicDetailView, self).get_context_data(**kwargs)
return context
+
+class ObjectAutocomplete(autocomplete.Select2QuerySetView):
+ def get_queryset(self):
+
+ #qs = chain(Topic.objects.all(), Article.objects.all())
+ #qs = Article.objects.all()
+ articles = Article.objects.all()
+ topics = Topic.objects.all()
+
+
+ if self.q:
+ #qs = qs.filter(name__istartswith=self.q)
+ articles = articles.filter(name__icontains=self.q)
+ topics = topics.filter(name__icontains=self.q)
+
+ qs = QuerySetSequence(articles, topics)
+
+ if self.q:
+ # This would apply the filter on all the querysets
+ qs = qs.filter(name__icontains=self.q)
+
+ # This will limit each queryset so that they show an equal number
+ # of results.
+ qs = self.mixup_querysets(qs)
+ print(qs)
+ return qs
# pip install psycopg2
# pip install -U https://forge.ircam.fr/p/django-eve/source/download/dev/
# pip install -U https://github.com/stephenmcd/grappelli-safe/archive/dynamic_stacked.zip
+# pip install django-querysetsequence
chown -R $uid:$gid $media
INSTALLED_APPS = [
"modeltranslation",
+ "dal",
+ "dal_select2",
+ "dal_queryset_sequence",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
'djangobower',
"meta",
"mezzanine_agenda",
- "orderable",
+# "orderable",
"organization.core",
"organization.team",
"organization.festival",
window.__admin_menu_collapsed = {{ settings.ADMIN_MENU_COLLAPSED|lower }};
window.__language_code = '{{ LANGUAGE_CODE }}';
</script>
-
{% if not settings.GRAPPELLI_INSTALLED %}
<script src="{% static "mezzanine/js/"|add:settings.JQUERY_FILENAME %}"></script>
{% endif %}
--- /dev/null
+{% extends "admin/base.html" %}
+{% load mezzanine_tags i18n staticfiles %}
+
+{% block title %}{{ title }} | Mezzanine{% endblock %}
+
+{% block extrahead %}
+<link rel="stylesheet" href="{% static "mezzanine/css/admin/global.css" %}">
+<style>
+ /* These are set in PageAdmin's view methods, and mezzanine.utils.admin.SingletonAdmin */
+ {% if hide_delete_link or singleton %}.submit-row .deletelink {display:none !important;}{% endif %}
+ {% if hide_slug_field %}.slug {display:none !important;}{% endif %}
+ {% if singleton %}.change-view-save-another {display:none !important;}{% endif %}
+</style>
+<script>
+ {% url "static_proxy" as static_proxy_url %}
+ {% url "fb_browse" as fb_browse_url %}
+ {% url "displayable_links_js" as link_list_url %}
+ {% url "admin:index" as admin_index_url %}
+ {% get_current_language as LANGUAGE_CODE %}
+ window.__home_link = '<a href="{% url "home" %}">{% trans "View site" %}</a>';
+ window.__csrf_token = '{{ csrf_token }}';
+ window.__admin_keywords_submit_url = '{% url "admin_keywords_submit" %}';
+ window.__filebrowser_url = '{{ fb_browse_url }}';
+ window.__link_list_url = '{{ link_list_url }}';
+ window.__tinymce_css = '{% static "mezzanine/css/tinymce.css" %}';
+ window.__admin_url = '{{ admin_index_url }}';
+ window.__static_proxy = '{{ static_proxy_url }}';
+ window.__admin_media_prefix__ = '{% static "admin" %}/';
+ window.__grappelli_installed = {{ settings.GRAPPELLI_INSTALLED|lower }};
+ window.__admin_menu_collapsed = {{ settings.ADMIN_MENU_COLLAPSED|lower }};
+ window.__language_code = '{{ LANGUAGE_CODE }}';
+</script>
+
+{% if not settings.GRAPPELLI_INSTALLED %}
+<script src="{% static "mezzanine/js/"|add:settings.JQUERY_FILENAME %}"></script>
+{% endif %}
+
+<script>
+jQuery(function($) {
+ $('.admin-title').click(function() {location = window.__admin_url;});
+ // This line can be removed after a decent amount of time has passed since
+ // https://github.com/stephenmcd/grappelli-safe/pull/56/files occurring.
+ $("#id_sitepermissions-__prefix__-sites").parent().parent().parent().remove();
+});
+</script>
+
+{% endblock %}
+
+{% block rtl_styles %}
+{{ block.super }}
+<link rel="stylesheet" type="text/css" href="{% static "mezzanine/css/admin/rtl.css" %}" />
+{% endblock %}
+
+{% block before_content %}
+{% if user.is_staff and not is_popup and not request.GET.pop %}
+{% admin_dropdown_menu %}
+{% endif %}
+{% endblock %}
+
+{% block footer %}
+{% if form.this_is_the_login_form %}
+ <script src="{% static "mezzanine/js/admin/login.js" %}"></script>
+{% else %}
+ {% if user.is_staff %}
+ {% if not is_popup and not request.GET.pop %}
+ <link rel="stylesheet" href="{% static "mezzanine/chosen/chosen.css" %}">
+ <!--<script src="{% static "mezzanine/chosen/chosen-0.9.12.jquery.js" %}"></script>-->
+ <script src="{% static "mezzanine/js/admin/navigation.js" %}"></script>
+
+ {% endif %}
+ <script src="{% static "mezzanine/js/admin/ajax_csrf.js" %}"></script>
+ {% if settings.GRAPPELLI_INSTALLED %}
+ <script src="{% static "mezzanine/js/admin/collapse_backport.js" %}"></script>
+ {% endif %}
+ {% endif %}
+{% endif %}
+{% endblock %}
{% load mezzanine_tags i18n staticfiles %}
{% compress js %}
- <script src="{% static "vendors/jquery/dist/jquery.min.js" %}"></script>
+ <!--<script src="{% static "vendors/jquery/dist/jquery.min.js" %}"></script>-->
<script src="{% static "vendors/overflow.js/js/overflow.js" %}"></script>
<script src="{% static "vendors/sticky-kit/jquery.sticky-kit.js" %}"></script>
<script src="{% static "vendors/jquery-throttle-debounce/jquery.ba-throttle-debounce.js" %}"></script>
-e git+https://github.com/yomguy/mezzanine-agenda.git#egg=mezzanine-agenda-0.2.2
-e git+https://github.com/stephenmcd/mezzanine.git@master#egg=mezzanine-4.1-master
-e git+https://github.com/stephenmcd/grappelli-safe.git@dynamic_stacked#egg=grappelli-safe-0.4.2
+-e git+https://github.com/yourlabs/django-autocomplete-light.git#egg=django-autocomplete-light
#https://forge.ircam.fr/p/django-eve/source/download/dev/
django-debug-toolbar
django-extensions
django-countries
-django-orderable