summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-07-31 10:46:50 +0200
committerÉtienne Loks <etienne@peacefrogs.net>2019-07-31 10:46:50 +0200
commitd2e3ce3fe1bca021190c8257367e8a444596724f (patch)
tree73d50da3dddea117777ecfeaad6926db0920b2c9
parent345a41be0318da980422ee74a67c363008d4de8d (diff)
downloadComm-on-net-d2e3ce3fe1bca021190c8257367e8a444596724f.tar.bz2
Comm-on-net-d2e3ce3fe1bca021190c8257367e8a444596724f.zip
Models refactoring
-rw-r--r--commcrawler/admin.py115
-rw-r--r--commcrawler/lookups.py41
-rw-r--r--commcrawler/migrations/0001_initial.py119
-rw-r--r--commcrawler/models.py93
-rw-r--r--commonnet/settings.py6
-rw-r--r--commorganization/__init__.py (renamed from commcrawler/management/__init__.py)0
-rw-r--r--commorganization/admin.py112
-rw-r--r--commorganization/apps.py7
-rw-r--r--commorganization/lookups.py49
-rw-r--r--commorganization/management/__init__.py (renamed from commcrawler/management/commands/__init__.py)0
-rw-r--r--commorganization/management/commands/__init__.py0
-rw-r--r--commorganization/management/commands/import_csv_autres.py (renamed from commcrawler/management/commands/import_csv_autres.py)2
-rw-r--r--commorganization/management/commands/import_csv_communes.py (renamed from commcrawler/management/commands/import_csv_communes.py)4
-rw-r--r--commorganization/migrations/0001_initial.py99
-rw-r--r--commorganization/migrations/__init__.py0
-rw-r--r--commorganization/models.py93
-rw-r--r--commorganization/tests.py3
-rw-r--r--commorganization/views.py3
18 files changed, 394 insertions, 352 deletions
diff --git a/commcrawler/admin.py b/commcrawler/admin.py
index 7ff1eed..ea4ca14 100644
--- a/commcrawler/admin.py
+++ b/commcrawler/admin.py
@@ -1,117 +1,10 @@
from ajax_select import make_ajax_form
-from django.contrib import admin, messages
-from django.contrib.auth.admin import GroupAdmin, UserAdmin
-from django.contrib.auth.models import Group, User
-from django import forms
-from django.http import HttpResponseRedirect
-from django.shortcuts import render
-from django.utils.translation import ugettext_lazy as _
+from django.contrib import admin
from commonnet.admin_site import admin_site
from commcrawler import models
-admin_site.register(User, UserAdmin)
-admin_site.register(Group, GroupAdmin)
-
-
-class AreaTypeAdmin(admin.ModelAdmin):
- model = models.AreaType
- list_display = ('name', )
-
-
-admin_site.register(models.AreaType, AreaTypeAdmin)
-
-
-class AreaAdmin(admin.ModelAdmin):
- model = models.Area
- list_display = ('name', 'area_type', 'reference', 'parent')
- list_filter = ('area_type',)
- search_fields = ['name', 'parent__name']
-
-
-admin_site.register(models.Area, AreaAdmin)
-
-
-class OrganizationTypeAdmin(admin.ModelAdmin):
- model = models.OrganizationType
- list_display = ('name', 'parent')
- list_filter = ('parent',)
-
-
-admin_site.register(models.OrganizationType, OrganizationTypeAdmin)
-
-
-class OrganizationAdmin(admin.ModelAdmin):
- model = models.Organization
- list_display = ('name', 'organization_type', 'area')
- list_filter = ('organization_type',)
- search_fields = ['name']
- form = make_ajax_form(model, {'area': 'area'})
-
-
-admin_site.register(models.Organization, OrganizationAdmin)
-
-
-class AddToCrawlForm(forms.Form):
- crawl = forms.ChoiceField(label=_("Crawl"), choices=tuple())
-
- def __init__(self, *args, **kwargs):
- super(AddToCrawlForm, self).__init__(*args, **kwargs)
- self.fields["crawl"].choices = [(None, "--")] + [
- (c.pk, str(c))
- for c in models.Crawl.objects.filter(status="C").all()
- ]
-
-
-class TargetAdmin(admin.ModelAdmin):
- list_display = ('name', 'url', 'organization')
- model = models.Target
- list_filter = ('organization__organization_type',)
- form = make_ajax_form(model, {'organization': 'organization'})
- actions = ['add_to_crawl']
-
- def add_to_crawl(self, request, queryset):
- if 'apply' in request.POST:
- form = AddToCrawlForm(request.POST)
- if form.is_valid():
- crawl = None
- try:
- crawl = models.Crawl.objects.get(
- pk=form.cleaned_data["crawl"],
- status="C"
- )
- except models.Crawl.DoesNotExist:
- pass
- if crawl:
- nb_added = 0
- targets = [
- c["id"] for c in crawl.targets.values("id")
- ]
- for target in queryset.all():
- if target.pk not in targets:
- crawl.targets.add(target)
- nb_added += 1
- messages.add_message(
- request, messages.INFO,
- str(_("{} new targets added to {}")).format(
- nb_added, str(crawl)
- )
- )
- return HttpResponseRedirect(request.get_full_path())
- else:
- form = AddToCrawlForm()
- return render(
- request, 'admin/add_to_crawl.html',
- context={"form": form, "query_nb": queryset.count(),
- "items": [v['pk'] for v in queryset.values('pk').all()]})
-
- add_to_crawl.short_description = _("Add to crawl")
-
-
-admin_site.register(models.Target, TargetAdmin)
-
-
class CrawlAdmin(admin.ModelAdmin):
model = models.Crawl
list_display = ("name", "status", "target_nb", "created", "started",
@@ -125,16 +18,17 @@ admin_site.register(models.Crawl, CrawlAdmin)
class CrawlResultAdmin(admin.ModelAdmin):
- model = models.Crawl
+ model = models.CrawlResult
list_display = ("target", "crawl", "is_online")
list_filter = ("crawl",)
+ form = make_ajax_form(model, {'target': 'target'})
admin_site.register(models.CrawlResult, CrawlResultAdmin)
class CrawlLinkAdmin(admin.ModelAdmin):
- model = models.Crawl
+ model = models.CrawlLink
list_display = ("result", "link")
@@ -146,6 +40,7 @@ class CrawlRelationAdmin(admin.ModelAdmin):
list_display = ("crawl", "source", "destination", "number")
list_filter = ("crawl",)
search_fields = ["source__name", "destination__name"]
+ form = make_ajax_form(model, {'source': 'target', 'destination': 'target'})
admin_site.register(models.CrawlRelation, CrawlRelationAdmin)
diff --git a/commcrawler/lookups.py b/commcrawler/lookups.py
index f8d4897..106a69a 100644
--- a/commcrawler/lookups.py
+++ b/commcrawler/lookups.py
@@ -1,28 +1,15 @@
-from ajax_select import register, LookupChannel as BaseLookupChannel
+from ajax_select import register
from django.db.models import Q
-from . import models
-
-
-class LookupChannel(BaseLookupChannel):
- def get_objects(self, items):
- # TODO: why IDs are not given here? M2M issue
- ids = []
- for item in items:
- if hasattr(item, 'pk'):
- ids.append(item.pk)
- else:
- ids.append(item)
- return super(LookupChannel, self).get_objects(ids)
+from commorganization.lookups import LookupChannel
- def format_item_display(self, item):
- return u"<span class='ajax-label'>%s</span>" % str(item)
+from . import models
-@register('organization')
-class OrganizationLookup(LookupChannel):
- model = models.Organization
+@register('target')
+class TargetLookup(LookupChannel):
+ model = models.Target
def get_query(self, q, request):
query = Q()
@@ -31,19 +18,3 @@ class OrganizationLookup(LookupChannel):
query &= subquery
return self.model.objects.filter(query).order_by('name')[:20]
-
-@register('area')
-class AreaLookup(LookupChannel):
- model = models.Area
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(' '):
- subquery = (
- Q(name__icontains=term) |
- Q(parent__name__icontains=term) |
- Q(reference=term)
- )
- query &= subquery
- return self.model.objects.filter(query).order_by('name')[:20]
-
diff --git a/commcrawler/migrations/0001_initial.py b/commcrawler/migrations/0001_initial.py
index 1468584..0b4e561 100644
--- a/commcrawler/migrations/0001_initial.py
+++ b/commcrawler/migrations/0001_initial.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.11 on 2019-07-31 07:48
+# Generated by Django 1.11 on 2019-07-31 08:21
from __future__ import unicode_literals
import datetime
@@ -12,36 +12,11 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
+ ('commorganization', '0001_initial'),
]
operations = [
migrations.CreateModel(
- name='Area',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(max_length=200, verbose_name='Name')),
- ('population', models.IntegerField(blank=True, null=True, verbose_name='Population')),
- ('reference', models.CharField(blank=True, help_text='For instance, INSEE code for towns', max_length=100, null=True, verbose_name='Reference')),
- ],
- options={
- 'verbose_name': 'Area',
- 'verbose_name_plural': 'Areas',
- 'ordering': ('name',),
- },
- ),
- migrations.CreateModel(
- name='AreaType',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(max_length=200, verbose_name='Name')),
- ],
- options={
- 'verbose_name': 'Area type',
- 'verbose_name_plural': 'Area types',
- 'ordering': ('name',),
- },
- ),
- migrations.CreateModel(
name='Crawl',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
@@ -50,11 +25,12 @@ class Migration(migrations.Migration):
('started', models.DateTimeField(blank=True, null=True, verbose_name='Start date')),
('ended', models.DateTimeField(blank=True, null=True, verbose_name='End date')),
('status', models.CharField(choices=[('C', 'Created'), ('P', 'In progress'), ('F', 'Finished')], default='C', max_length=1)),
+ ('targets', models.ManyToManyField(blank=True, to='commorganization.Target')),
],
options={
- 'verbose_name': 'Crawl',
- 'verbose_name_plural': 'Crawls',
'ordering': ('created', 'name'),
+ 'verbose_name_plural': 'Crawls',
+ 'verbose_name': 'Crawl',
},
),
migrations.CreateModel(
@@ -64,8 +40,8 @@ class Migration(migrations.Migration):
('link', models.URLField(verbose_name='Link')),
],
options={
- 'verbose_name': 'Crawl link',
'verbose_name_plural': 'Crawl links',
+ 'verbose_name': 'Crawl link',
},
),
migrations.CreateModel(
@@ -74,10 +50,12 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('number', models.IntegerField(default=1, verbose_name='Number')),
('crawl', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commcrawler.Crawl', verbose_name='Crawl')),
+ ('destination', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relation_destination', to='commorganization.Target', verbose_name='Destination')),
+ ('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relation_source', to='commorganization.Target', verbose_name='Source')),
],
options={
- 'verbose_name': 'Crawl relation',
'verbose_name_plural': 'Crawl relations',
+ 'verbose_name': 'Crawl relation',
},
),
migrations.CreateModel(
@@ -102,91 +80,16 @@ class Migration(migrations.Migration):
('is_online', models.BooleanField(default=False, verbose_name='Website is online')),
('redirection', models.URLField(blank=True, null=True, verbose_name='Redirection')),
('crawl', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commcrawler.Crawl', verbose_name='Crawl')),
+ ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commorganization.Target', verbose_name='Target')),
],
options={
- 'verbose_name': 'Crawl result',
'verbose_name_plural': 'Crawl results',
+ 'verbose_name': 'Crawl result',
},
),
- migrations.CreateModel(
- name='Organization',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(max_length=200, verbose_name='Name')),
- ('address', models.TextField(blank=True, null=True, verbose_name='Address')),
- ('area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='commcrawler.Area', verbose_name='Area')),
- ],
- options={
- 'verbose_name': 'Organization',
- 'verbose_name_plural': 'Organizations',
- 'ordering': ('name',),
- },
- ),
- migrations.CreateModel(
- name='OrganizationType',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(max_length=200, verbose_name='Name')),
- ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='commcrawler.OrganizationType', verbose_name='Parent')),
- ],
- options={
- 'verbose_name': 'Organization type',
- 'verbose_name_plural': 'Organization types',
- 'ordering': ('parent__name', 'name'),
- },
- ),
- migrations.CreateModel(
- name='Target',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(max_length=200, verbose_name='Name')),
- ('url', models.URLField(blank=True, null=True, verbose_name='URL')),
- ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='commcrawler.Organization', verbose_name='Organization')),
- ],
- options={
- 'verbose_name': 'Target',
- 'verbose_name_plural': 'Targets',
- 'ordering': ('name',),
- },
- ),
- migrations.AddField(
- model_name='organization',
- name='organization_type',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commcrawler.OrganizationType', verbose_name='Type'),
- ),
- migrations.AddField(
- model_name='crawlresult',
- name='target',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commcrawler.Target', verbose_name='Target'),
- ),
- migrations.AddField(
- model_name='crawlrelation',
- name='destination',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relation_destination', to='commcrawler.Target', verbose_name='Destination'),
- ),
- migrations.AddField(
- model_name='crawlrelation',
- name='source',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relation_source', to='commcrawler.Target', verbose_name='Source'),
- ),
migrations.AddField(
model_name='crawllink',
name='result',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commcrawler.CrawlResult', verbose_name='Result'),
),
- migrations.AddField(
- model_name='crawl',
- name='targets',
- field=models.ManyToManyField(blank=True, to='commcrawler.Target'),
- ),
- migrations.AddField(
- model_name='area',
- name='area_type',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commcrawler.AreaType', verbose_name='Type'),
- ),
- migrations.AddField(
- model_name='area',
- name='parent',
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='commcrawler.Area', verbose_name='Parent'),
- ),
]
diff --git a/commcrawler/models.py b/commcrawler/models.py
index c15ce7e..bf73ce3 100644
--- a/commcrawler/models.py
+++ b/commcrawler/models.py
@@ -3,96 +3,7 @@ import datetime
from django.db import models
from django.utils.translation import ugettext_lazy as _
-
-class AreaType(models.Model):
- name = models.CharField(_("Name"), max_length=200)
-
- class Meta:
- verbose_name = _("Area type")
- verbose_name_plural = _("Area types")
- ordering = ("name", )
-
- def __str__(self):
- return self.name
-
-
-class Area(models.Model):
- name = models.CharField(verbose_name=_("Name"), max_length=200)
- area_type = models.ForeignKey(
- AreaType, on_delete=models.CASCADE, verbose_name=_("Type"))
- population = models.IntegerField(verbose_name=_("Population"), blank=True,
- null=True)
- reference = models.CharField(
- verbose_name=_("Reference"), max_length=100, blank=True, null=True,
- help_text=_("For instance, INSEE code for towns")
- )
- parent = models.ForeignKey("Area", verbose_name=_("Parent"),
- blank=True, null=True)
-
- class Meta:
- verbose_name = _("Area")
- verbose_name_plural = _("Areas")
- ordering = ("name", )
-
- def __str__(self):
- if not self.parent:
- return self.name
- return "{} / {}".format(self.parent, self.name)
-
-
-class OrganizationType(models.Model):
- name = models.CharField(_("Name"), max_length=200)
- parent = models.ForeignKey("OrganizationType", verbose_name=_("Parent"),
- blank=True, null=True)
-
- class Meta:
- verbose_name = _("Organization type")
- verbose_name_plural = _("Organization types")
- ordering = ("parent__name", "name", )
-
- def __str__(self):
- if not self.parent:
- return self.name
- return "{} / {}".format(self.parent, self.name)
-
-
-class Organization(models.Model):
- name = models.CharField(verbose_name=_("Name"), max_length=200)
- area = models.ForeignKey(
- Area, on_delete=models.SET_NULL, verbose_name=_("Area"), blank=True,
- null=True
- )
- organization_type = models.ForeignKey(
- OrganizationType, on_delete=models.CASCADE, verbose_name=_("Type"))
- address = models.TextField(verbose_name=_("Address"), blank=True, null=True)
-
- class Meta:
- verbose_name = _("Organization")
- verbose_name_plural = _("Organizations")
- ordering = ("name", )
-
- def __str__(self):
- if not self.area:
- return "{} ({})".format(
- self.name, self.organization_type)
- return "{} - {} ({})".format(
- self.name, self.area, self.organization_type)
-
-
-class Target(models.Model):
- name = models.CharField(verbose_name=_("Name"), max_length=200)
- url = models.URLField(verbose_name=_("URL"), blank=True, null=True)
- organization = models.ForeignKey(
- Organization, verbose_name=_("Organization"), blank=True,
- null=True, on_delete=models.SET_NULL)
-
- class Meta:
- verbose_name = _("Target")
- verbose_name_plural = _("Targets")
- ordering = ("name",)
-
- def __str__(self):
- return "{} ({})".format(self.name, self.organization)
+from commorganization.models import Target
class Crawl(models.Model):
@@ -108,7 +19,7 @@ class Crawl(models.Model):
ended = models.DateTimeField(
verbose_name=_("End date"), blank=True, null=True)
status = models.CharField(max_length=1, choices=STATUS, default='C')
- targets = models.ManyToManyField("Target", blank=True)
+ targets = models.ManyToManyField(Target, blank=True)
class Meta:
verbose_name = _("Crawl")
diff --git a/commonnet/settings.py b/commonnet/settings.py
index 4ca0fbf..26c5c66 100644
--- a/commonnet/settings.py
+++ b/commonnet/settings.py
@@ -1,12 +1,7 @@
import os
-# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
-# Quick-start development settings - unsuitable for production
-# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
-
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '!lh+r$hzd(_-aj8a2&@)34bat=w&=!k+9w%$_+&^gjhf#n6z42'
@@ -19,6 +14,7 @@ ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
+ 'commorganization.apps.CommOrganizationConfig',
'commcrawler.apps.CommCrawlerConfig',
'ajax_select',
'django.contrib.admin',
diff --git a/commcrawler/management/__init__.py b/commorganization/__init__.py
index e69de29..e69de29 100644
--- a/commcrawler/management/__init__.py
+++ b/commorganization/__init__.py
diff --git a/commorganization/admin.py b/commorganization/admin.py
new file mode 100644
index 0000000..2b3c042
--- /dev/null
+++ b/commorganization/admin.py
@@ -0,0 +1,112 @@
+from ajax_select import make_ajax_form
+from django.contrib import admin, messages
+from django.contrib.auth.admin import GroupAdmin, UserAdmin
+from django.contrib.auth.models import Group, User
+from django import forms
+from django.http import HttpResponseRedirect
+from django.shortcuts import render
+from django.utils.translation import ugettext_lazy as _
+
+from commonnet.admin_site import admin_site
+from commorganization import models
+
+
+admin_site.register(User, UserAdmin)
+admin_site.register(Group, GroupAdmin)
+
+
+class AreaTypeAdmin(admin.ModelAdmin):
+ model = models.AreaType
+ list_display = ('name', )
+
+
+admin_site.register(models.AreaType, AreaTypeAdmin)
+
+
+class AreaAdmin(admin.ModelAdmin):
+ model = models.Area
+ list_display = ('name', 'area_type', 'reference', 'parent')
+ list_filter = ('area_type',)
+ search_fields = ['name', 'parent__name']
+
+
+admin_site.register(models.Area, AreaAdmin)
+
+
+class OrganizationTypeAdmin(admin.ModelAdmin):
+ model = models.OrganizationType
+ list_display = ('name', 'parent')
+ list_filter = ('parent',)
+
+
+admin_site.register(models.OrganizationType, OrganizationTypeAdmin)
+
+
+class OrganizationAdmin(admin.ModelAdmin):
+ model = models.Organization
+ list_display = ('name', 'organization_type', 'area')
+ list_filter = ('organization_type',)
+ search_fields = ['name']
+ form = make_ajax_form(model, {'area': 'area'})
+
+
+admin_site.register(models.Organization, OrganizationAdmin)
+
+
+class AddToCrawlForm(forms.Form):
+ crawl = forms.ChoiceField(label=_("Crawl"), choices=tuple())
+
+ def __init__(self, *args, **kwargs):
+ super(AddToCrawlForm, self).__init__(*args, **kwargs)
+ self.fields["crawl"].choices = [(None, "--")] + [
+ (c.pk, str(c))
+ for c in models.Crawl.objects.filter(status="C").all()
+ ]
+
+
+class TargetAdmin(admin.ModelAdmin):
+ list_display = ('name', 'url', 'organization')
+ model = models.Target
+ list_filter = ('organization__organization_type',)
+ form = make_ajax_form(model, {'organization': 'organization'})
+ actions = ['add_to_crawl']
+
+ def add_to_crawl(self, request, queryset):
+ if 'apply' in request.POST:
+ form = AddToCrawlForm(request.POST)
+ if form.is_valid():
+ crawl = None
+ try:
+ crawl = models.Crawl.objects.get(
+ pk=form.cleaned_data["crawl"],
+ status="C"
+ )
+ except models.Crawl.DoesNotExist:
+ pass
+ if crawl:
+ nb_added = 0
+ targets = [
+ c["id"] for c in crawl.targets.values("id")
+ ]
+ for target in queryset.all():
+ if target.pk not in targets:
+ crawl.targets.add(target)
+ nb_added += 1
+ messages.add_message(
+ request, messages.INFO,
+ str(_("{} new targets added to {}")).format(
+ nb_added, str(crawl)
+ )
+ )
+ return HttpResponseRedirect(request.get_full_path())
+ else:
+ form = AddToCrawlForm()
+ return render(
+ request, 'admin/add_to_crawl.html',
+ context={"form": form, "query_nb": queryset.count(),
+ "items": [v['pk'] for v in queryset.values('pk').all()]})
+
+ add_to_crawl.short_description = _("Add to crawl")
+
+
+admin_site.register(models.Target, TargetAdmin)
diff --git a/commorganization/apps.py b/commorganization/apps.py
new file mode 100644
index 0000000..32c623d
--- /dev/null
+++ b/commorganization/apps.py
@@ -0,0 +1,7 @@
+from django.apps import AppConfig
+from django.utils.translation import ugettext_lazy as _
+
+
+class CommOrganizationConfig(AppConfig):
+ name = 'commorganization'
+ verbose_name = _("Organization")
diff --git a/commorganization/lookups.py b/commorganization/lookups.py
new file mode 100644
index 0000000..f8d4897
--- /dev/null
+++ b/commorganization/lookups.py
@@ -0,0 +1,49 @@
+from ajax_select import register, LookupChannel as BaseLookupChannel
+
+from django.db.models import Q
+
+from . import models
+
+
+class LookupChannel(BaseLookupChannel):
+ def get_objects(self, items):
+ # TODO: why IDs are not given here? M2M issue
+ ids = []
+ for item in items:
+ if hasattr(item, 'pk'):
+ ids.append(item.pk)
+ else:
+ ids.append(item)
+ return super(LookupChannel, self).get_objects(ids)
+
+ def format_item_display(self, item):
+ return u"<span class='ajax-label'>%s</span>" % str(item)
+
+
+@register('organization')
+class OrganizationLookup(LookupChannel):
+ model = models.Organization
+
+ def get_query(self, q, request):
+ query = Q()
+ for term in q.strip().split(' '):
+ subquery = Q(name__icontains=term)
+ query &= subquery
+ return self.model.objects.filter(query).order_by('name')[:20]
+
+
+@register('area')
+class AreaLookup(LookupChannel):
+ model = models.Area
+
+ def get_query(self, q, request):
+ query = Q()
+ for term in q.strip().split(' '):
+ subquery = (
+ Q(name__icontains=term) |
+ Q(parent__name__icontains=term) |
+ Q(reference=term)
+ )
+ query &= subquery
+ return self.model.objects.filter(query).order_by('name')[:20]
+
diff --git a/commcrawler/management/commands/__init__.py b/commorganization/management/__init__.py
index e69de29..e69de29 100644
--- a/commcrawler/management/commands/__init__.py
+++ b/commorganization/management/__init__.py
diff --git a/commorganization/management/commands/__init__.py b/commorganization/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/commorganization/management/commands/__init__.py
diff --git a/commcrawler/management/commands/import_csv_autres.py b/commorganization/management/commands/import_csv_autres.py
index 2dd177c..6874cad 100644
--- a/commcrawler/management/commands/import_csv_autres.py
+++ b/commorganization/management/commands/import_csv_autres.py
@@ -3,7 +3,7 @@ import sys
from django.core.management.base import BaseCommand
-from commcrawler.models import Organization, OrganizationType, Target
+from commorganization.models import Organization, OrganizationType, Target
header_len = 1
expected_header = [
diff --git a/commcrawler/management/commands/import_csv_communes.py b/commorganization/management/commands/import_csv_communes.py
index 4024067..d0ff23a 100644
--- a/commcrawler/management/commands/import_csv_communes.py
+++ b/commorganization/management/commands/import_csv_communes.py
@@ -3,8 +3,8 @@ import sys
from django.core.management.base import BaseCommand
-from commcrawler.models import Area, AreaType, Organization, OrganizationType,\
- Target
+from commorganization.models import Area, AreaType, Organization, \
+ OrganizationType, Target
header_len = 1
expected_header = [
diff --git a/commorganization/migrations/0001_initial.py b/commorganization/migrations/0001_initial.py
new file mode 100644
index 0000000..891f297
--- /dev/null
+++ b/commorganization/migrations/0001_initial.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2019-07-31 08:21
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Area',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200, verbose_name='Name')),
+ ('population', models.IntegerField(blank=True, null=True, verbose_name='Population')),
+ ('reference', models.CharField(blank=True, help_text='For instance, INSEE code for towns', max_length=100, null=True, verbose_name='Reference')),
+ ],
+ options={
+ 'ordering': ('name',),
+ 'verbose_name_plural': 'Areas',
+ 'verbose_name': 'Area',
+ },
+ ),
+ migrations.CreateModel(
+ name='AreaType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200, verbose_name='Name')),
+ ],
+ options={
+ 'ordering': ('name',),
+ 'verbose_name_plural': 'Area types',
+ 'verbose_name': 'Area type',
+ },
+ ),
+ migrations.CreateModel(
+ name='Organization',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200, verbose_name='Name')),
+ ('address', models.TextField(blank=True, null=True, verbose_name='Address')),
+ ('area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='commorganization.Area', verbose_name='Area')),
+ ],
+ options={
+ 'ordering': ('name',),
+ 'verbose_name_plural': 'Organizations',
+ 'verbose_name': 'Organization',
+ },
+ ),
+ migrations.CreateModel(
+ name='OrganizationType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200, verbose_name='Name')),
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='commorganization.OrganizationType', verbose_name='Parent')),
+ ],
+ options={
+ 'ordering': ('parent__name', 'name'),
+ 'verbose_name_plural': 'Organization types',
+ 'verbose_name': 'Organization type',
+ },
+ ),
+ migrations.CreateModel(
+ name='Target',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200, verbose_name='Name')),
+ ('url', models.URLField(blank=True, null=True, verbose_name='URL')),
+ ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='commorganization.Organization', verbose_name='Organization')),
+ ],
+ options={
+ 'ordering': ('name',),
+ 'verbose_name_plural': 'Targets',
+ 'verbose_name': 'Target',
+ },
+ ),
+ migrations.AddField(
+ model_name='organization',
+ name='organization_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commorganization.OrganizationType', verbose_name='Type'),
+ ),
+ migrations.AddField(
+ model_name='area',
+ name='area_type',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='commorganization.AreaType', verbose_name='Type'),
+ ),
+ migrations.AddField(
+ model_name='area',
+ name='parent',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='commorganization.Area', verbose_name='Parent'),
+ ),
+ ]
diff --git a/commorganization/migrations/__init__.py b/commorganization/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/commorganization/migrations/__init__.py
diff --git a/commorganization/models.py b/commorganization/models.py
new file mode 100644
index 0000000..a2b0994
--- /dev/null
+++ b/commorganization/models.py
@@ -0,0 +1,93 @@
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+
+class AreaType(models.Model):
+ name = models.CharField(_("Name"), max_length=200)
+
+ class Meta:
+ verbose_name = _("Area type")
+ verbose_name_plural = _("Area types")
+ ordering = ("name", )
+
+ def __str__(self):
+ return self.name
+
+
+class Area(models.Model):
+ name = models.CharField(verbose_name=_("Name"), max_length=200)
+ area_type = models.ForeignKey(
+ AreaType, on_delete=models.CASCADE, verbose_name=_("Type"))
+ population = models.IntegerField(verbose_name=_("Population"), blank=True,
+ null=True)
+ reference = models.CharField(
+ verbose_name=_("Reference"), max_length=100, blank=True, null=True,
+ help_text=_("For instance, INSEE code for towns")
+ )
+ parent = models.ForeignKey("Area", verbose_name=_("Parent"),
+ blank=True, null=True)
+
+ class Meta:
+ verbose_name = _("Area")
+ verbose_name_plural = _("Areas")
+ ordering = ("name", )
+
+ def __str__(self):
+ if not self.parent:
+ return self.name
+ return "{} / {}".format(self.parent, self.name)
+
+
+class OrganizationType(models.Model):
+ name = models.CharField(_("Name"), max_length=200)
+ parent = models.ForeignKey("OrganizationType", verbose_name=_("Parent"),
+ blank=True, null=True)
+
+ class Meta:
+ verbose_name = _("Organization type")
+ verbose_name_plural = _("Organization types")
+ ordering = ("parent__name", "name", )
+
+ def __str__(self):
+ if not self.parent:
+ return self.name
+ return "{} / {}".format(self.parent, self.name)
+
+
+class Organization(models.Model):
+ name = models.CharField(verbose_name=_("Name"), max_length=200)
+ area = models.ForeignKey(
+ Area, on_delete=models.SET_NULL, verbose_name=_("Area"), blank=True,
+ null=True
+ )
+ organization_type = models.ForeignKey(
+ OrganizationType, on_delete=models.CASCADE, verbose_name=_("Type"))
+ address = models.TextField(verbose_name=_("Address"), blank=True, null=True)
+
+ class Meta:
+ verbose_name = _("Organization")
+ verbose_name_plural = _("Organizations")
+ ordering = ("name", )
+
+ def __str__(self):
+ if not self.area:
+ return "{} ({})".format(
+ self.name, self.organization_type)
+ return "{} - {} ({})".format(
+ self.name, self.area, self.organization_type)
+
+
+class Target(models.Model):
+ name = models.CharField(verbose_name=_("Name"), max_length=200)
+ url = models.URLField(verbose_name=_("URL"), blank=True, null=True)
+ organization = models.ForeignKey(
+ Organization, verbose_name=_("Organization"), blank=True,
+ null=True, on_delete=models.SET_NULL)
+
+ class Meta:
+ verbose_name = _("Target")
+ verbose_name_plural = _("Targets")
+ ordering = ("name",)
+
+ def __str__(self):
+ return "{} ({})".format(self.name, self.organization)
diff --git a/commorganization/tests.py b/commorganization/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/commorganization/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/commorganization/views.py b/commorganization/views.py
new file mode 100644
index 0000000..91ea44a
--- /dev/null
+++ b/commorganization/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.