From 1774c3faa3a7354c691fa4d3d8003717255e0820 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 30 Jan 2017 12:20:34 +0000 Subject: [PATCH] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/tests.py | 49 ---- accounts_app/tests.py | 16 -- chatbot/tests.py | 3 - clientsideapp/tests.py | 1 - gmap/admin.py | 43 --- gmap/forms.py | 20 -- gmap/migrations/0001_initial.py | 114 -------- gmap/models.py | 369 ------------------------- gmap/tests.py | 1 - gmap/urls.py | 16 -- gmap/utils.py | 143 ---------- gmap/views.py | 250 ----------------- ip_pool/tests.py | 1 - mapapp/tests.py | 3 - photo_app/tests.py | 16 -- privatemessage/tests.py | 22 -- searchapp/tests.py | 1 - static/css/gmap.css | 4 - static/img/0ZKOa52wPuc.jpg | Bin 43610 -> 0 bytes static/img/kpkLhcH5R4E.jpg | Bin 4474 -> 0 bytes statistics/tests.py | 1 - tariff_app/tests.py | 1 - taskapp/tests.py | 1 - templates/maps/gmap.html | 135 --------- templates/maps/gmap_import_errors.html | 15 - templates/maps/gmap_search.html | 6 - 26 files changed, 1231 deletions(-) delete mode 100644 abonapp/tests.py delete mode 100644 accounts_app/tests.py delete mode 100644 chatbot/tests.py delete mode 100644 clientsideapp/tests.py delete mode 100644 gmap/admin.py delete mode 100644 gmap/forms.py delete mode 100644 gmap/migrations/0001_initial.py delete mode 100644 gmap/models.py delete mode 100644 gmap/tests.py delete mode 100644 gmap/urls.py delete mode 100644 gmap/utils.py delete mode 100644 gmap/views.py delete mode 100644 ip_pool/tests.py delete mode 100644 mapapp/tests.py delete mode 100644 photo_app/tests.py delete mode 100644 privatemessage/tests.py delete mode 100644 searchapp/tests.py delete mode 100644 static/css/gmap.css delete mode 100644 static/img/0ZKOa52wPuc.jpg delete mode 100644 static/img/kpkLhcH5R4E.jpg delete mode 100644 statistics/tests.py delete mode 100644 tariff_app/tests.py delete mode 100644 taskapp/tests.py delete mode 100644 templates/maps/gmap.html delete mode 100644 templates/maps/gmap_import_errors.html delete mode 100644 templates/maps/gmap_search.html diff --git a/abonapp/tests.py b/abonapp/tests.py deleted file mode 100644 index 040f05f..0000000 --- a/abonapp/tests.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -from django.shortcuts import get_object_or_404 -from django.test import TestCase - -from .models import Abon, AbonTariff -from tariff_app.models import Tariff - - -class AbonTariffTestCase(TestCase): - def setUp(self): - abon1 = Abon.objects.create( - telephone='+79784653751', - fio='ФИО абона', - username='аго мучич' - ) - tarif1 = Tariff.objects.create( - title='Тариф 1', - speedIn=120.3, - speedOut=53, - amount=38 - ) - tarif2 = Tariff.objects.create( - title='Тариф 2', - speedIn=130.3, - speedOut=23, - amount=82 - ) - AbonTariff.objects.create( - abon=abon1, - tariff=tarif1, - tariff_priority=0 - ) - AbonTariff.objects.create( - abon=abon1, - tariff=tarif2, - tariff_priority=1 - ) - - def test_activate_next(self): - # возьмём абонента для опытов - abn = get_object_or_404(Abon, username='аго мучич') - - # берём купленные услуги - ats = AbonTariff.objects.filter(abon=abn) - for at in ats: - # и пробуем назначить - at.activate_next_tariff() - - AbonTariff.objects.update_priorities(ats) diff --git a/accounts_app/tests.py b/accounts_app/tests.py deleted file mode 100644 index 501deb7..0000000 --- a/accounts_app/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -This file demonstrates writing tests using the unittest module. These will pass -when you run "manage.py test". - -Replace this with more appropriate tests for your application. -""" - -from django.test import TestCase - - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.assertEqual(1 + 1, 2) diff --git a/chatbot/tests.py b/chatbot/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/chatbot/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/clientsideapp/tests.py b/clientsideapp/tests.py deleted file mode 100644 index a39b155..0000000 --- a/clientsideapp/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/gmap/admin.py b/gmap/admin.py deleted file mode 100644 index 8cea1e9..0000000 --- a/gmap/admin.py +++ /dev/null @@ -1,43 +0,0 @@ -from django.contrib import admin - -from gmap.models import MapMarker, MarkerCategory, MarkerSubCategory, SalesDirector, SalesBoundary, CountryISOCode - - -class MarkerAdmin(admin.ModelAdmin): - list_display = [ - 'name', - 'contact_title', - 'category', - 'contact_name', - 'airport_code', - 'address', - 'platinum', - 'airport_name', - 'phone', - 'fax', - 'email', - 'url' - ] - exclude = ('latitude', 'longitude') - - -class MarkerInline(admin.TabularInline): - model = MapMarker - exclude = ('latitude', 'longitude') - extra = 1 - - -class BoundaryAdmin(admin.ModelAdmin): - list_display = ['boundary_code', 'owner'] - - -class DirectorAdmin(admin.ModelAdmin): - list_display = ['name', 'country'] - - -admin.site.register(MapMarker, MarkerAdmin) -admin.site.register(MarkerCategory) -admin.site.register(MarkerSubCategory) -admin.site.register(CountryISOCode) -admin.site.register(SalesDirector, DirectorAdmin) -admin.site.register(SalesBoundary, BoundaryAdmin) diff --git a/gmap/forms.py b/gmap/forms.py deleted file mode 100644 index 908383b..0000000 --- a/gmap/forms.py +++ /dev/null @@ -1,20 +0,0 @@ -from django import forms - -from gmap.models import MapMarker, CountryISOCode - - -class ModifiedChoiceField(forms.ModelChoiceField): - def label_from_instance(self, obj): - if 'long_name' in obj: - return obj['long_name'] - - if 'state' in obj: - return obj['state'] - - return 'No Data' - - -class MapSearchForm(forms.Form): - state = ModifiedChoiceField( - queryset=MapMarker.objects.filter(country__iso_3='USA').values('state').order_by('state').distinct(), label='') - country = ModifiedChoiceField(queryset=CountryISOCode.objects.order_by('long_name').values('long_name'), label='') diff --git a/gmap/migrations/0001_initial.py b/gmap/migrations/0001_initial.py deleted file mode 100644 index 3d949fd..0000000 --- a/gmap/migrations/0001_initial.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2016-11-30 15:15 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='CountryISOCode', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('long_name', models.CharField(max_length=200)), - ('iso_3', models.CharField(blank=True, max_length=10)), - ('iso_2', models.CharField(blank=True, max_length=10)), - ], - ), - migrations.CreateModel( - name='MapMarker', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('latitude', models.CharField(blank=True, max_length=30)), - ('longitude', models.CharField(blank=True, max_length=30)), - ('platinum', models.BooleanField(default=False, verbose_name='Platinum Partner')), - ('contact_name', models.CharField(blank=True, max_length=50)), - ('contact_title', models.CharField(blank=True, max_length=50)), - ('airport_name', models.CharField(blank=True, max_length=100)), - ('airport_code', models.CharField(blank=True, max_length=6)), - ('address', models.TextField(blank=True, max_length=200)), - ('city', models.CharField(blank=True, max_length=200)), - ('state', models.CharField(blank=True, max_length=50)), - ('zipcode', models.CharField(blank=True, max_length=10)), - ('phone', models.CharField(blank=True, max_length=40)), - ('fax', models.CharField(blank=True, max_length=40)), - ('email', models.EmailField(blank=True, max_length=254)), - ('url', models.URLField(blank=True)), - ], - ), - migrations.CreateModel( - name='MarkerCategory', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200, unique=True, verbose_name='type')), - ('position', models.IntegerField(default=0)), - ('icon', models.ImageField(blank=True, upload_to='gmap-icons/', verbose_name='icon')), - ('platinum_icon', models.ImageField(blank=True, upload_to='gmap-icons/', verbose_name='platinum icon')), - ('shadow', models.ImageField(blank=True, upload_to='gmap-icons/', verbose_name='icon shadow')), - ], - ), - migrations.CreateModel( - name='MarkerSubCategory', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200, unique=True, verbose_name='Name')), - ], - ), - migrations.CreateModel( - name='SalesBoundary', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('boundary_code', models.CharField(max_length=75, verbose_name='Boundary Code')), - ], - ), - migrations.CreateModel( - name='SalesDirector', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, unique=True, verbose_name='Name')), - ('title', models.CharField(blank=True, max_length=50)), - ('phone', models.CharField(blank=True, max_length=40, verbose_name='Phone Number')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='Email')), - ('airport_code', models.CharField(blank=True, max_length=8)), - ('airport_name', models.CharField(blank=True, max_length=50)), - ('address', models.TextField(blank=True, max_length=200)), - ('city', models.CharField(blank=True, max_length=200)), - ('state', models.CharField(blank=True, max_length=100)), - ('zipcode', models.CharField(blank=True, max_length=10)), - ('url', models.URLField(blank=True)), - ('country', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='gmap.CountryISOCode')), - ], - ), - migrations.AddField( - model_name='salesboundary', - name='owner', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gmap.SalesDirector'), - ), - migrations.AddField( - model_name='mapmarker', - name='category', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='gmap.MarkerCategory'), - ), - migrations.AddField( - model_name='mapmarker', - name='country', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='gmap.CountryISOCode'), - ), - migrations.AddField( - model_name='mapmarker', - name='sub_categories', - field=models.ManyToManyField(related_name='sub_categories', to='gmap.MarkerSubCategory'), - ), - migrations.AlterUniqueTogether( - name='salesboundary', - unique_together={('boundary_code', 'owner')}, - ), - ] diff --git a/gmap/models.py b/gmap/models.py deleted file mode 100644 index 18c29a7..0000000 --- a/gmap/models.py +++ /dev/null @@ -1,369 +0,0 @@ -from django.db import models - -from gmap.utils import geolocate - - -CATEGORY_LOOKUP = {'1': 'Cirrus Authorized Service Center (ASC)', '2': 'Cirrus Sales Representative or Center', - '3': 'Cirrus Training Center (CTC)', '4': 'Cirrus Standardized Instructor Pilot (CSIP)'} - -INVERSE_CATEGORY = dict((v, k) for k, v in CATEGORY_LOOKUP.items()) - -SUBCATEGORY_LOOKUP = { - - '1': 'Composite & Paint Repair', - '2': 'Pickup & Delivery Service', - '3': 'Parts Distributor', - '4': 'Air Conditioning Service', - '5': 'Garmin Service', - '6': 'Avidyne Service', - '7': 'Full Avionics Facility', - '8': 'Oxygen Service', - '9': 'Wi-Fi Equipped', - '10': 'CAPS Overhaul', - '11': 'Cirrus Platinum Service Partner', - '12': 'Ice Protection System Maintenance', - '13': 'SR20 Rental', - '14': 'SR22 Rental', - '15': 'SR22T Rental', - '16': 'Cirrus Perspective Avionics Available', - '17': 'Avidyne Entegra Avionics Available', - '18': 'Cirrus Platinum Training Partner', - '19': 'Simulator Available', - '20': 'Cirrus Perspective Qualified', - '21': 'Avidyne Entegra Qualified', - '22': 'New Cirrus Sales', - '23': 'Used Cirrus Sales', - '24': 'n/a' - -} - -INVERSE_SUBCATEGORY = dict((v, k) for k, v in SUBCATEGORY_LOOKUP.items()) - -# name, category, platinum partner, contacT_name, contact_title, airport_name, airport_code, address, phone, fax, email, url, sub_category1, ..., sub_categoryN - -SUBCAT_IDX = 18 -# SUBCAT_IDX = 12 - -# NAME_COLUMN = 2 -NAME_COLUMN = 0 -#CATEGORY_COLUMN = 3 -CATEGORY_COLUMN = 1 -#ADDRESS_COLUMN = 9 -ADDRESS_COLUMN = 7 -SUBCATEGORY_COLUMN = SUBCAT_IDX - - -class SalesBoundary(models.Model): - boundary_code = models.CharField('Boundary Code', max_length=75) - owner = models.ForeignKey('SalesDirector'); - - class Meta: - unique_together = ("boundary_code", "owner") - - def __str__(self): - return self.boundary_code - - -class SalesDirector(models.Model): - name = models.CharField('Name', max_length=100, unique=True) - title = models.CharField(max_length=50, blank=True) - phone = models.CharField('Phone Number', max_length=40, blank=True) - email = models.EmailField('Email', blank=True) - airport_code = models.CharField(max_length=8, blank=True) - airport_name = models.CharField(max_length=50, blank=True) - address = models.TextField(max_length=200, blank=True) - city = models.CharField(max_length=200, blank=True) - state = models.CharField(max_length=100, blank=True) - zipcode = models.CharField(max_length=10, blank=True) - url = models.URLField(blank=True) - country = models.ForeignKey('CountryISOCode', blank=True) - - def from_csv(self, row, row_id, errors): - - local_errors = False - - ''' - self.name, cat, plat, self.contact_name, self.contact_title = row[0:5] - self.airport_name, self.airport_code, self.address, self.phone, self.fax = row[5:10] - self.email, self.url = row[10:12] - - subcategories = row[12:] - ''' - - cat, plat = '', '' - subcategories = [] - - try: - - self.name, cat, plat, self.contact_name, self.title = row[0:5] - self.airport_name, self.airport_code, self.address, self.phone, fax = row[5:10] - self.email, self.url, self.state, iso_3, self.city, self.zipcode, latitude, longitude = row[10:SUBCAT_IDX] - - subcat_string = row[SUBCAT_IDX] - - if ',' in subcat_string: - subcategories = subcat_string.split(',') - - else: - subcategories = [subcat_string] - - except IndexError: - error_string = "Entry does not contain required number of fields: %s < %s" % (len(row), SUBCAT_IDX) - errors.append(('%s : %s' % (row_id, error_string))) - return - - except ValueError: - error_string = "Entry does not contain required number of fields: %s < %s" % (len(row), SUBCAT_IDX) - errors.append(('%s : %s' % (row_id, error_string))) - return - - if not self.name: - local_errors = True - row[NAME_COLUMN] = 'INSERT_NAME' - - if local_errors: - error_string = ', '.join(row) - errors.append(('%s : %s' % (row_id, error_string))) - return - - try: - self.country = CountryISOCode.objects.get(long_name=iso_3) - - except: - - try: - self.country = CountryISOCode.objects.get(iso_3=iso_3) - - except: - - try: - self.country = CountryISOCode.objects.get(iso_2=iso_3) - - except: - error_string = "Unable to map %s to ISO long name, two letter abbreviation, or three letter abbreviation" % iso_3 - errors.append(('%s : %s' % (row_id, error_string))) - - # Ask django really, really nicely not to insert our object twice - self.save() - - def __str__(self): - return self.name - - -class MarkerCategoryManager(models.Manager): - def get_by_natural_key(self, name): - return self.get(name=name) - - -class MarkerCategory(models.Model): - objects = MarkerCategoryManager() - name = models.CharField('type', max_length=200, unique=True) - position = models.IntegerField(default=0); - icon = models.ImageField('icon', blank=True, upload_to='gmap-icons/') - platinum_icon = models.ImageField('platinum icon', blank=True, upload_to='gmap-icons/') - shadow = models.ImageField('icon shadow', blank=True, upload_to='gmap-icons/') - - def natural_key(self): - return self.name - - def __str__(self): - return self.name - - -class MarkerSubCategory(models.Model): - objects = MarkerCategoryManager() - name = models.CharField('Name', max_length=200, unique=True) - - def natural_key(self): - return self.name - - def __str__(self): - return self.name - - -class GeolocateFailure(Exception): - def __init__(self, message, address): - self.message = message - self.address = address - - def __str__(self): - return '%s - %s' % (self.message, self.address) - - -class CountryISOCode(models.Model): - long_name = models.CharField(max_length=200) - iso_3 = models.CharField(max_length=10, blank=True) - iso_2 = models.CharField(max_length=10, blank=True) - - def natural_key(self): - return self.long_name - - def __str__(self): - return self.long_name - - -class MapMarker(models.Model): - name = models.CharField(max_length=200) - latitude = models.CharField(max_length=30, blank=True) - longitude = models.CharField(max_length=30, blank=True) - category = models.ForeignKey('MarkerCategory') - platinum = models.BooleanField('Platinum Partner', default=False) - sub_categories = models.ManyToManyField(MarkerSubCategory, related_name='sub_categories') - contact_name = models.CharField(max_length=50, blank=True) - contact_title = models.CharField(max_length=50, blank=True) - airport_name = models.CharField(max_length=100, blank=True) - airport_code = models.CharField(max_length=6, blank=True) - address = models.TextField(max_length=200, blank=True) - city = models.CharField(max_length=200, blank=True) - state = models.CharField(max_length=50, blank=True) - zipcode = models.CharField(max_length=10, blank=True) - country = models.ForeignKey('CountryISOCode', null=True, blank=True) - phone = models.CharField(max_length=40, blank=True) - fax = models.CharField(max_length=40, blank=True) - email = models.EmailField(blank=True) - url = models.URLField(blank=True) - - # Make sure we update the lat/long with the location - def save(self, *args, **kwargs): - - if not self.latitude and not self.longitude: - full_address = "%s, %s, %s, %s, %s" % (self.address, self.city, self.state, self.zipcode, self.country) - latlng = geolocate(repr(full_address)) - - if latlng != None: - self.latitude = latlng['latitude'] - self.longitude = latlng['longitude'] - - else: - raise GeolocateFailure("Failed to geolocate address for %s" % self.name, full_address) - - super().save(*args, **kwargs) - - def __str__(self): - return self.name - - def from_csv(self, row, row_id, errors): - - local_errors = False - - ''' - self.name, cat, plat, self.contact_name, self.contact_title = row[0:5] - self.airport_name, self.airport_code, self.address, self.phone, self.fax = row[5:10] - self.email, self.url = row[10:12] - - subcategories = row[12:] - ''' - - cat, plat = '', '' - subcategories = [] - - try: - - self.name, cat, plat, self.contact_name, self.contact_title = row[0:5] - self.airport_name, self.airport_code, self.address, self.phone, self.fax = row[5:10] - self.email, self.url, self.state, iso_3, self.city, self.zipcode, self.latitude, self.longitude = row[ - 10:SUBCAT_IDX] - - subcat_string = row[SUBCAT_IDX] - - if ',' in subcat_string: - subcategories = subcat_string.split(',') - - else: - subcategories = [subcat_string] - - except IndexError: - error_string = "Entry does not contain required number of fields: %s < %s" % (len(row), SUBCAT_IDX) - errors.append(('%s : %s' % (row_id, error_string))) - return - - except ValueError: - error_string = "Entry does not contain required number of fields: %s < %s" % (len(row), SUBCAT_IDX) - errors.append(('%s : %s' % (row_id, error_string))) - return - - if not self.name: - local_errors = True - row[NAME_COLUMN] = 'INSERT_NAME' - - if not cat: - local_errors = True - row[CATEGORY_COLUMN] = 'INSERT_CATEGORY' - - #if not self.address: - # local_errors = True - # row[ADDRESS_COLUMN] = 'INSERT_ADDRESS' - - if not len(subcategories): - local_errors = True - row.append('INSERT_SUBCATEGORY') - - elif not subcategories[0]: - local_errors = True - row[SUBCATEGORY_COLUMN] = 'INSERT_SUBCATEGORY' - - if local_errors: - error_string = ', '.join(row) - errors.append(('%s : %s' % (row_id, error_string))) - return - - self.platinum = True if plat == '1' else False - - self.category = MarkerCategory.objects.get(pk=cat.strip().strip("'")) - - try: - self.country = CountryISOCode.objects.get(long_name=iso_3) - - except: - - try: - self.country = CountryISOCode.objects.get(iso_3=iso_3) - - except: - - try: - self.country = CountryISOCode.objects.get(iso_2=iso_3) - - except: - error_string = "Unable to map %s to ISO long name, two letter abbreviation, or three letter abbreviation" % iso_3 - errors.append(('%s : %s' % (row_id, error_string))) - - # object's gotta be in the DB before it can get M2M mapping... - # - try: - self.save() - - except GeolocateFailure as inst: - errors.append('%s : %s' % (row_id, inst)) - return - - # ...like this one! - for subcategory in subcategories: - if subcategory: - self.sub_categories.add(MarkerSubCategory.objects.get(pk=subcategory.strip().strip("'"))) - - - # Ask django really, really nicely not to insert our object twice - self.save(force_update=True) - - # Expected csv format: - # - # name, category, platinum partner, contacT_name, contact_title, airport_name, airport_code, address, phone, fax, email, url, sub_category1, ..., sub_categoryN - # - def csv_row(self): - - # my baseline doesn't have: plat partner, contact_name, contact_title, airport_name, - # TODO: now it does! - - ''' - return [self.latitude, self.longitude, self.name, INVERSE_CATEGORY[self.category.name], str(self.platinum), self.contact_name, self.contact_title, - self.airport_name, self.airport_code, self.address, self.phone, self.fax, - self.email, self.url] + [INVERSE_SUBCATEGORY[subcat.name] for subcat in self.sub_categories.all()] - ''' - - return [self.name, INVERSE_CATEGORY[self.category.name], str(self.platinum), self.contact_name, - self.contact_title, - self.airport_name, self.airport_code, self.address, self.phone, self.fax, - self.email, self.url] + [INVERSE_SUBCATEGORY[subcat.name] for subcat in self.sub_categories.all()] - - diff --git a/gmap/tests.py b/gmap/tests.py deleted file mode 100644 index a39b155..0000000 --- a/gmap/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/gmap/urls.py b/gmap/urls.py deleted file mode 100644 index 35ec1e6..0000000 --- a/gmap/urls.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.conf.urls import url - -from gmap.views import index, showmap, markers, gmap_search, categories, dump_csv, director_by_boundary, director_import - - -app_name = 'gmap' -urlpatterns = [ - url(r'^$', index, name="index"), - url(r'^markers.json$', markers, name="markers"), - url(r'^categories.json$', categories, name="categories"), - url(r'^directors/(?P.+)/$', director_by_boundary, name="directors"), - url(r'^boundary_import/$', director_import, name="boundary_import"), - url(r'^search/?', gmap_search, name="gmap_search"), - url(r'^(?P
\w+)$', showmap, name="show_map"), - url(r'^csv/?', dump_csv, name="dump_csv"), -] diff --git a/gmap/utils.py b/gmap/utils.py deleted file mode 100644 index 82b71d3..0000000 --- a/gmap/utils.py +++ /dev/null @@ -1,143 +0,0 @@ -import json -import urllib.request, urllib.parse, urllib.error -import urllib.request, urllib.error, urllib.parse -import csv -import codecs -import io - - -def csvByLine(csvFile, lineHandler): - errors = '' - for row_id, line in enumerate(UnicodeReader(csvFile)): - print(("Calling Line handler for %s" % line)) - errors = ''.join([errors, lineHandler(line)]) - return errors - - -def geolocate(location, sensor=False): - """ - Take a "location" and return its latitude and longitude - - Keyword arguments: - location - String defining a geographical location (address, zip code, etc) - sensor - Boolean defining whether the location was taken from - an on-device sensor - - Output: - latitude and logitude in an dict - """ - sensor = str(sensor).lower() - url = "http://maps.googleapis.com/maps/api/geocode/json?" - url += urllib.parse.urlencode({'address': location, 'sensor': sensor}) - data = urllib.request.urlopen(url).read() - data = json.loads(data) - if data and data['status'] == 'OK': - return ({ - 'latitude': data['results'][0]['geometry']['location']['lat'], - 'longitude': data['results'][0]['geometry']['location']['lng'] - }) - else: - return None - - -def georeverse(lat, lon): - # construct url for reverse geocoding with google-maps - url = "http://maps.googleapis.com/maps/api/geocode/json?" - url += urllib.parse.urlencode({'latlng': lat + ',' + lon, 'sensor': 'false'}) - - # retrieve and load google-map data - data = urllib.request.urlopen(url).read() - data = json.loads(data) - - # if request goes through, return the state and country of the location - if data['status'] == 'OK': - address_components = data['results'][0]['address_components'] - - # these probably shouldn't be booleans (test with None data-type at some point) - country = False - state = False - - for component in address_components: - - try: - if component['types'][0] == 'country': - country = component['long_name'] - - if component['types'][0] == 'administrative_area_level_1': - state = component['long_name'] - except Exception: - pass - - return ({ - 'state': state, - 'country': country - }) - return ({ - 'state': False, - 'country': False - }) - - -class UTF8Recoder: - """ - Iterator that reads an encoded stream and reencodes the input to UTF-8 - """ - - def __init__(self, f, encoding): - self.reader = codecs.getreader(encoding)(f) - - def __iter__(self): - return self - - def __next__(self): - # return self.reader.next().decode("cp1252").encode("utf-8") - return self.reader.next().encode("utf-8") - - -class UnicodeReader: - """ - A CSV reader which will iterate over lines in the CSV file "f", - which is encoded in the given encoding. - """ - - # def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): - def __init__(self, f, dialect=csv.excel, encoding="cp1252", **kwds): - f = UTF8Recoder(f, encoding) - self.reader = csv.reader(f, dialect=dialect, **kwds) - - def __next__(self): - row = next(self.reader) - return [str(s, "utf-8") for s in row] - - def __iter__(self): - return self - - -class UnicodeWriter: - """ - A CSV writer which will write rows to CSV file "f", - which is encoded in the given encoding. - """ - - def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): - # Redirect output to a queue - self.queue = io.StringIO() - self.writer = csv.writer(self.queue, dialect=dialect, **kwds) - self.stream = f - self.encoder = codecs.getincrementalencoder(encoding)() - - def writerow(self, row): - self.writer.writerow([s.encode("utf-8") for s in row]) - # Fetch UTF-8 output from the queue ... - data = self.queue.getvalue() - data = data.decode("utf-8") - # ... and reencode it into the target encoding - data = self.encoder.encode(data) - # write to the target stream - self.stream.write(data) - # empty queue - self.queue.truncate(0) - - def writerows(self, rows): - for row in rows: - self.writerow(row) diff --git a/gmap/views.py b/gmap/views.py deleted file mode 100644 index 98d9c06..0000000 --- a/gmap/views.py +++ /dev/null @@ -1,250 +0,0 @@ -import csv -import tempfile -import time - -from django.conf import settings -from django.core import serializers -from django.http import HttpResponse, HttpResponseRedirect -from django.shortcuts import render, render_to_response - -from gmap.utils import geolocate, georeverse, csvByLine -from gmap.models import MapMarker, MarkerCategory, SalesDirector, SalesBoundary -from gmap.forms import MapSearchForm -import gmap.utils - - -def index(request): - form = MapSearchForm() - response = render(request, 'maps/gmap.html', {'form': form}) - response['Cache-Control'] = 'no-cache' - return response - - -def newsales(args): - try: - director_name, code = tuple(args) - except: - err = open("Errors.log", "a") - err_text = "Issues getting tuple from: %s\n" % args - err.write(err_text) - err.close() - return err_text - - director, new_director = SalesDirector.objects.get_or_create(name=director_name) - boundary, created = SalesBoundary.objects.get_or_create(boundary_code=code, owner=director) - - if (new_director): - err = open("Errors.log", "a") - err_text = "We had to make a new director named: %s\n" % director_name - err.write(err_text) - err.close() - return err_text - return "" - - -def director_import(request): - errors = csvByLine(request.FILES['datafile'], newsales) - return HttpResponse(errors.replace('\n', '
')) - - -def showmap(request, address='', category=''): - context = {} - context['media_url'] = settings.MEDIA_URL - - if request.method == 'POST': - address = request.POST.get('address', address) - category = request.POST.get('category', category) - if request.method == 'GET': - address = request.GET.get('address', address) - category = request.GET.get('category', category) - - if category: - context['gmap_markers'] = MapMarker.objects.get( - marker_type__category_name__iexact=category - ) - else: - context['gmap_markers'] = MapMarker.objects.all() - - if address: - latlng = geolocate(address) - if latlng: - context['gmap_center_lat'] = latlng['latitude'] - context['gmap_center_lng'] = latlng['longitude'] - else: - context['error'] = "Please try another address." - - return render(request, 'maps/gmap.html', context) - - -def markers(request): - # Show all categories but Sales Centers - data = serializers.serialize("json", MapMarker.objects.all().order_by('category__position', 'city'), - use_natural_keys=True) - return HttpResponse(data, mimetype='applicaton/javascript') - - -def categories(request): - data = serializers.serialize("json", MarkerCategory.objects.all().order_by('position'), use_natural_keys=True) - return HttpResponse(data, mimetype='applicaton/javascript') - - -def director_by_boundary(request, boundary_code): - # get a director based on a boundarycode (zip/postal/country code) - data = serializers.serialize("json", SalesDirector.objects.filter(salesboundary__boundary_code=boundary_code), - use_natural_keys=True) - return HttpResponse(data, mimetype='applicaton/javascript') - - -def gmap_search(request): - context = {} - return render(request, 'maps/gmap_search.html', context) - - -def dump_csv(request): - all_markers = MapMarker.objects.all() - - print(('# markers: ', len(all_markers))) - - # all_markers should now have all the things... - response = HttpResponse(mimetype='text/csv') - response['Content-Disposition'] = 'attachment; filename=map_markers.csv' - - # writer = csv.writer(response, quoting=csv.QUOTE_MINIMAL, lineterminator='\n') - writer = gmap.utils.UnicodeWriter(response, quoting=csv.QUOTE_MINIMAL, lineterminator='\n') - - for marker in all_markers: - row = marker.csv_row() - # print 'row is: ', row - - # repr because there are non-ascii characters somewhere - writer.writerow(row) - - ''' - writer.writerow(['First row', 'Foo', 'Bar', 'Baz']) - writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"]) - ''' - - return response - - -def populatefields(request): - all_markers = MapMarker.objects.all() - start_time = time.time() - - # loop over all map markers and update their state and country fields - for marker in all_markers: - reverse_addy = georeverse(marker.latitude, marker.longitude) - - if reverse_addy['country']: - marker.country = reverse_addy['country'] - - if reverse_addy['state']: - marker.state = reverse_addy['state'] - - marker.save() - - end_time = time.time() - return HttpResponse(end_time - start_time) - - -def process_sales_row(row_id, row, errors): - try: - sales_director = SalesDirector.objects.get(name=row[0]) - - except SalesDirector.DoesNotExist: - sales_director = SalesDirector() - - sales_director.from_csv(row, row_id + 1, errors) - - -def process_marker_row(row_id, row, errors): - try: - marker = MapMarker.objects.get(name=row[0], zipcode=row[15]) - - except: - marker = MapMarker() - - marker.from_csv(row, row_id + 1, errors) - - -# TODO: return errors? -def process_row(row_id, row, errors): - if row[1] == '2': - - process_sales_row(row_id, row, errors) - - else: - - process_marker_row(row_id, row, errors) - - -def read_csv(request): - if request.method == 'POST' and 'datafile' in request.FILES: - - # it's conceivable the user could upload a file large enough - # it gets split into chunks - to handle this we just direct all - # the chunks to a temp file and process that - - # note that the tempfile will be deleted as soon as - # the with block is completes - num_processed = -1 - delta = 0 - errors = [] - - if request.FILES['datafile'].multiple_chunks(): - MapMarker.objects.all().delete() - - delta = time.clock() - - with tempfile.TemporaryFile() as local_file: - - for chunk in request.FILES['datafile'].chunks(): - local_file.write(chunk) - - local_file.seek(0) - - for row_id, row in enumerate(gmap.utils.UnicodeReader(local_file)): - - try: - process_row(row_id, row, errors) - - except Exception as inst: - errors.append("%s : Unable to import entry - %s" % (row_id, inst)) - - num_processed = row_id - - delta = time.clock() - delta - - else: - - delta = time.clock() - - for row_id, row in enumerate(gmap.utils.UnicodeReader(request.FILES['datafile'])): - # try: - process_row(row_id, row, errors) - - # except Exception as inst: - # errors.append("%s : Unable to import entry - %s" % (row_id, inst)) - - num_processed = row_id - - delta = time.clock() - delta - - if len(errors) > 1: - # Strip off errors result from Excel export garbage (the bottom two entries) - # - bottoms = errors[-2:] - rows = [row.split(':')[0].strip() for row in bottoms] - - if int(rows[0]) == row_id: - errors = errors[0:-2] - - if errors: - return render_to_response('maps/gmap_import_errors.html', {'errors': errors}) - - else: - return HttpResponseRedirect('/gmap/mapmarker/') - - else: - # todo - can I make django redirect to referring page? - return HttpResponseRedirect('/gmap/') diff --git a/ip_pool/tests.py b/ip_pool/tests.py deleted file mode 100644 index a39b155..0000000 --- a/ip_pool/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/mapapp/tests.py b/mapapp/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/mapapp/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/photo_app/tests.py b/photo_app/tests.py deleted file mode 100644 index 501deb7..0000000 --- a/photo_app/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -This file demonstrates writing tests using the unittest module. These will pass -when you run "manage.py test". - -Replace this with more appropriate tests for your application. -""" - -from django.test import TestCase - - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.assertEqual(1 + 1, 2) diff --git a/privatemessage/tests.py b/privatemessage/tests.py deleted file mode 100644 index ce3f289..0000000 --- a/privatemessage/tests.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.test import TestCase -from django.contrib.auth.models import User - -from . import models - - -class PaysTest(TestCase): - def setUp(self): - self.msg = models.PrivateMessages.objects.create( - sender=User.objects.all()[0], - recepient=User.objects.all()[0], - text='test init text' - ) - - def tearDown(self): - models.PrivateMessages.objects.all().delete() - - def check_ret_msgs(self): - """check return messages""" - request = self.factory.get('/message/') - self.assertIsInstance(models.PrivateMessages.objects.get_my_messages(request), int, 'checking ret type') - self.assertGreater(models.PrivateMessages.objects.get_my_messages(request), 0, 'checking msg count') diff --git a/searchapp/tests.py b/searchapp/tests.py deleted file mode 100644 index a39b155..0000000 --- a/searchapp/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/static/css/gmap.css b/static/css/gmap.css deleted file mode 100644 index 20beee0..0000000 --- a/static/css/gmap.css +++ /dev/null @@ -1,4 +0,0 @@ -#gmap_canvas { - width: 500px; - height: 300px; -} diff --git a/static/img/0ZKOa52wPuc.jpg b/static/img/0ZKOa52wPuc.jpg deleted file mode 100644 index 7e26edb4c6eeb72024f06c09fb419d71fb80503f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43610 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 M*Zk*oDgK=MKY>hD)c^nh diff --git a/static/img/kpkLhcH5R4E.jpg b/static/img/kpkLhcH5R4E.jpg deleted file mode 100644 index f45991abb7d03577f8bad35586926736487c4247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4474 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 auspcs%4vNmx{UncwJLFe9l*_WKJh<|LOL}7 diff --git a/statistics/tests.py b/statistics/tests.py deleted file mode 100644 index a39b155..0000000 --- a/statistics/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/tariff_app/tests.py b/tariff_app/tests.py deleted file mode 100644 index a39b155..0000000 --- a/tariff_app/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/taskapp/tests.py b/taskapp/tests.py deleted file mode 100644 index a39b155..0000000 --- a/taskapp/tests.py +++ /dev/null @@ -1 +0,0 @@ -# Create your tests here. diff --git a/templates/maps/gmap.html b/templates/maps/gmap.html deleted file mode 100644 index 089a6f1..0000000 --- a/templates/maps/gmap.html +++ /dev/null @@ -1,135 +0,0 @@ -{% extends 'base.html' %} - -{% block js %} - {{ block.super }} - - - - - - - -{% endblock js %} - -{% block main %} - -{% endblock main %} diff --git a/templates/maps/gmap_import_errors.html b/templates/maps/gmap_import_errors.html deleted file mode 100644 index e553102..0000000 --- a/templates/maps/gmap_import_errors.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "admin/base_site.html" %} - -{% block title %}CSV Import Summary{% endblock %} - -{% block content %} -
-

The following entries could not be imported:

-
    - {% for error in errors %} -
  • {% autoescape off %} {{ error }} {% endautoescape %}

  • - {% endfor %} -
-

Return to the Administration Page.

-
-{% endblock %} diff --git a/templates/maps/gmap_search.html b/templates/maps/gmap_search.html deleted file mode 100644 index 70f49b4..0000000 --- a/templates/maps/gmap_search.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
- Cirrus Locator -
- -
-
- -
- -
-
- - - - - - - - - - - -
- -
- -
- -
- -
- -

Use the locator below to find a Regional Sales Director , - International Sales Center, Cirrus Sales Center, Authorized - Service Center (ASC), Cirrus Training Center (CTC), or - Cirrus Standardized Instructor Pilot (CSIP). -

- -
- -
- - ZIP Code - -
- State - {{ form.state }} -
- Country - {{ form.country }} -
-
- -
-
-
-
- - -
-
-

- -

- -

- -
-
    -
    -
      - -
    -
    -
    - - -