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