├── .gitignore ├── README.md ├── css ├── requirements.txt └── stocksearch ├── .swp ├── crawl.sh ├── crawlers ├── __init__.py ├── admin.py ├── apps.py ├── blockhash.py ├── crawler.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ ├── crawl.py │ │ ├── crawl.py.save │ │ ├── create_hashes.py │ │ ├── duplicates.py │ │ └── script.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20151014_0126.py │ ├── 0002_auto_20151015_0134.py │ ├── 0003_auto_20151014_0304.py │ ├── 0003_auto_20151019_1422.py │ ├── 0004_auto_20151014_0328.py │ ├── 0004_delete_searchquery.py │ ├── 0005_auto_20151014_1052.py │ ├── 0006_auto_20151014_1338.py │ ├── 0007_auto_20151014_2029.py │ ├── 0008_merge.py │ ├── 0009_auto_20151016_2358.py │ ├── 0010_auto_20151017_0310.py │ ├── 0011_merge.py │ ├── 0012_auto_20151024_2000.py │ ├── 0013_auto_20151030_2032.py │ ├── 0014_image_created.py │ ├── 0015_auto_20151102_1855.py │ ├── 0016_auto_20151104_1539.py │ ├── 0017_auto_20151109_1056.py │ ├── 0018_auto_20151109_1102.py │ ├── 0019_auto_20151109_1112.py │ ├── 0020_auto_20160111_2145.py │ ├── 0021_auto_20160123_2359.py │ ├── 0022_auto_20160124_1345.py │ ├── 0023_auto_20160822_0204.py │ ├── 0024_auto_20160822_0238.py │ ├── 0025_auto_20160822_1248.py │ ├── 0026_auto_20160822_1319.py │ └── __init__.py ├── models.py ├── origins.py ├── tests.py └── views.py ├── data.json ├── manage.py ├── newrelic.ini ├── static ├── admin │ ├── css │ │ ├── base.css │ │ ├── changelists.css │ │ ├── dashboard.css │ │ ├── forms.css │ │ ├── ie.css │ │ ├── login.css │ │ ├── rtl.css │ │ └── widgets.css │ ├── img │ │ ├── changelist-bg.gif │ │ ├── changelist-bg_rtl.gif │ │ ├── default-bg-reverse.gif │ │ ├── default-bg.gif │ │ ├── deleted-overlay.gif │ │ ├── gis │ │ │ ├── move_vertex_off.png │ │ │ └── move_vertex_on.png │ │ ├── icon-no.gif │ │ ├── icon-unknown.gif │ │ ├── icon-yes.gif │ │ ├── icon_addlink.gif │ │ ├── icon_alert.gif │ │ ├── icon_calendar.gif │ │ ├── icon_changelink.gif │ │ ├── icon_clock.gif │ │ ├── icon_deletelink.gif │ │ ├── icon_error.gif │ │ ├── icon_searchbox.png │ │ ├── icon_success.gif │ │ ├── inline-delete-8bit.png │ │ ├── inline-delete.png │ │ ├── inline-restore-8bit.png │ │ ├── inline-restore.png │ │ ├── inline-splitter-bg.gif │ │ ├── nav-bg-grabber.gif │ │ ├── nav-bg-reverse.gif │ │ ├── nav-bg-selected.gif │ │ ├── nav-bg.gif │ │ ├── selector-icons.gif │ │ ├── selector-search.gif │ │ ├── sorting-icons.gif │ │ ├── tooltag-add.png │ │ └── tooltag-arrowright.png │ └── js │ │ ├── LICENSE-JQUERY.txt │ │ ├── SelectBox.js │ │ ├── SelectFilter2.js │ │ ├── actions.js │ │ ├── actions.min.js │ │ ├── admin │ │ ├── DateTimeShortcuts.js │ │ └── RelatedObjectLookups.js │ │ ├── calendar.js │ │ ├── collapse.js │ │ ├── collapse.min.js │ │ ├── core.js │ │ ├── inlines.js │ │ ├── inlines.min.js │ │ ├── jquery.init.js │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ ├── prepopulate.js │ │ ├── prepopulate.min.js │ │ ├── related-widget-wrapper.js │ │ ├── timeparse.js │ │ └── urlify.js ├── css │ ├── about.css │ ├── base.css │ ├── home.css │ └── search.css ├── debug_toolbar │ ├── css │ │ ├── print.css │ │ └── toolbar.css │ ├── img │ │ ├── ajax-loader.gif │ │ ├── back.png │ │ ├── back_hover.png │ │ ├── close.png │ │ ├── close_hover.png │ │ ├── djdt_vertical.png │ │ └── indicator.png │ └── js │ │ ├── jquery_existing.js │ │ ├── jquery_post.js │ │ ├── jquery_pre.js │ │ ├── toolbar.js │ │ ├── toolbar.profiling.js │ │ ├── toolbar.sql.js │ │ ├── toolbar.template.js │ │ └── toolbar.timer.js ├── django_extensions │ ├── css │ │ └── jquery.autocomplete.css │ ├── img │ │ └── indicator.gif │ └── js │ │ ├── jquery-1.7.2.min.js │ │ ├── jquery.ajaxQueue.js │ │ ├── jquery.autocomplete.js │ │ └── jquery.bgiframe.min.js ├── images │ ├── BlueLogo.png │ ├── BlueLogo.svg │ ├── WhiteLogo.png │ ├── android-chrome-144x144.png │ ├── android-chrome-192x192.png │ ├── android-chrome-36x36.png │ ├── android-chrome-48x48.png │ ├── android-chrome-72x72.png │ ├── android-chrome-96x96.png │ ├── apple-touch-icon-114x114.png │ ├── apple-touch-icon-120x120.png │ ├── apple-touch-icon-144x144.png │ ├── apple-touch-icon-152x152.png │ ├── apple-touch-icon-180x180.png │ ├── apple-touch-icon-57x57.png │ ├── apple-touch-icon-60x60.png │ ├── apple-touch-icon-72x72.png │ ├── apple-touch-icon-76x76.png │ ├── apple-touch-icon-precomposed.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── facebook.svg │ ├── facebook_white.svg │ ├── favicon-16x16.png │ ├── favicon-194x194.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── favicon.ico │ ├── manifest.json │ ├── mstile-144x144.png │ ├── mstile-150x150.png │ ├── mstile-310x150.png │ ├── mstile-310x310.png │ ├── mstile-70x70.png │ ├── pablo.png │ ├── pablo2.png │ ├── paypal.png │ ├── preloader.gif │ ├── search.svg │ ├── twitter.svg │ └── twitter_white.svg ├── js │ ├── fuckadblock.js │ ├── infinite_scrolling.js │ └── replace.js └── sass │ ├── about.scss │ ├── base.scss │ ├── home.scss │ └── search.scss ├── stocksearch ├── __init__.py ├── settings │ ├── __init__.py │ ├── base.py │ ├── development.py │ └── production.py ├── urls.py └── wsgi.py └── website ├── __init__.py ├── admin.py ├── forms.py ├── migrations ├── 0001_initial.py └── __init__.py ├── models.py ├── templates ├── _images.html ├── about.html ├── base.html ├── duplicates.html ├── home.html ├── image_text.txt └── search.html ├── tests.py ├── urls.py └── views.py /.gitignore: -------------------------------------------------------------------------------- 1 | media/ 2 | .sass-cache/ 3 | *.css.map 4 | __pycache__/ 5 | *.py[cod] 6 | *~ 7 | **/*~ 8 | # Django stuff: 9 | *.log 10 | *.pot 11 | .fuse_hidden* 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # StockSearch 2 | A search engine for completely free stock photos 3 | -------------------------------------------------------------------------------- /css: -------------------------------------------------------------------------------- 1 | /* 2 | Errno::ENOENT: No such file or directory @ rb_sysopen - sass 3 | 4 | Backtrace: 5 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:482:in `read' 6 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:482:in `update_stylesheet' 7 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:215:in `block in update_stylesheets' 8 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:209:in `each' 9 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:209:in `update_stylesheets' 10 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:293:in `watch' 11 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/plugin.rb:108:in `method_missing' 12 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/exec/sass_scss.rb:384:in `watch_or_update' 13 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/exec/sass_scss.rb:51:in `process_result' 14 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/exec/base.rb:52:in `parse' 15 | /var/lib/gems/2.1.0/gems/sass-3.4.18/lib/sass/exec/base.rb:19:in `parse!' 16 | /var/lib/gems/2.1.0/gems/sass-3.4.18/bin/sass:13:in `' 17 | /usr/local/bin/sass:23:in `load' 18 | /usr/local/bin/sass:23:in `
' 19 | */ 20 | body:before { 21 | white-space: pre; 22 | font-family: monospace; 23 | content: "Errno::ENOENT: No such file or directory @ rb_sysopen - sass"; } 24 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | beautifulsoup4==4.4.1 2 | blockhash==0.1.0 3 | decorator==4.0.4 4 | Distance==0.1.3 5 | Django==1.8.4 6 | django-debug-toolbar==1.5 7 | django-extensions==1.5.7 8 | django-watson==1.2.0 9 | Pillow==3.1.0 10 | psycopg2==2.6.1 11 | ptyprocess==0.5 12 | Pygments==2.0.2 13 | requests==2.7.0 14 | six==1.9.0 15 | sqlparse==0.2.1 16 | -------------------------------------------------------------------------------- /stocksearch/.swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/.swp -------------------------------------------------------------------------------- /stocksearch/crawl.sh: -------------------------------------------------------------------------------- 1 | python manage.py crawl PX 2 | -------------------------------------------------------------------------------- /stocksearch/crawlers/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'crawlers.apps.CrawlersConfig' -------------------------------------------------------------------------------- /stocksearch/crawlers/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | from .models import Image, Tag, Crawler 5 | 6 | class ImageInline(admin.TabularInline): 7 | model = Image.tags.through 8 | 9 | class TagInline(admin.TabularInline): 10 | model = Image.tags.through 11 | 12 | @admin.register(Image) 13 | class ImageAdmin(admin.ModelAdmin): 14 | search_fields = ['tags__name','page_url'] 15 | list_display = ("page_url","clicks") 16 | readonly_fields=['tags'] 17 | 18 | def tags(self, image): 19 | tags = [] 20 | for tag in image.tags.all(): 21 | tags.append(str(tag)) 22 | return ', '.join(tags) 23 | 24 | @admin.register(Tag) 25 | class TagAdmin(admin.ModelAdmin): 26 | inlines = [ImageInline] 27 | 28 | @admin.register(Crawler) 29 | class CrawlerAdmin(admin.ModelAdmin): 30 | pass -------------------------------------------------------------------------------- /stocksearch/crawlers/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from watson import search as watson 3 | 4 | class CrawlersConfig(AppConfig): 5 | name = "crawlers" 6 | def ready(self): 7 | Image = self.get_model("Image") 8 | watson.register(Image, fields=('tags__name',), store=('thumbnail__url', 'page_url', 'source_url', 'get_origin_display', 'tags__name')) 9 | -------------------------------------------------------------------------------- /stocksearch/crawlers/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/crawlers/management/__init__.py -------------------------------------------------------------------------------- /stocksearch/crawlers/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/crawlers/management/commands/__init__.py -------------------------------------------------------------------------------- /stocksearch/crawlers/management/commands/create_hashes.py: -------------------------------------------------------------------------------- 1 | from django.core.management.base import BaseCommand, CommandError 2 | from crawlers.models import Image 3 | from django.db.utils import IntegrityError 4 | 5 | class Command(BaseCommand): 6 | def add_arguments(self, parser): 7 | # Named (optional) arguments 8 | parser.add_argument('--fix', 9 | action='store_true', 10 | dest='fix', 11 | default=False, 12 | help='Delete duplicate images') 13 | 14 | def handle(self, *args, **options): 15 | images = Image.objects.all() 16 | if options['fix']: 17 | images = Image.objects.extra(where=['CHAR_LENGTH(hash)!=576']) 18 | print("There are {} broken hashes, fixing..".format(images.count())) 19 | length = len(images) 20 | for i,image in enumerate(images): 21 | image.create_hash() 22 | print("hashed {} of {}".format(i+1,length)) -------------------------------------------------------------------------------- /stocksearch/crawlers/management/commands/duplicates.py: -------------------------------------------------------------------------------- 1 | from django.core.management.base import BaseCommand, CommandError 2 | from crawlers.models import Image 3 | from django.db.utils import IntegrityError 4 | import pdb 5 | 6 | class Command(BaseCommand): 7 | def add_arguments(self, parser): 8 | # Named (optional) arguments 9 | parser.add_argument('--delete', 10 | action='store_true', 11 | dest='delete', 12 | default=False, 13 | help='Delete duplicate images') 14 | 15 | def handle(self, *args, **options): 16 | images = Image.objects.distinct('hash') 17 | delete_images = 0 18 | for image in images: 19 | images2 = Image.objects.extra(where=['hamming_text(hash,%s)>=0.92'], params=[image.hash]).exclude(origin=image.origin) 20 | for image2 in images2: 21 | print("{} is a duplicate of {}".format(image.page_url,image2.page_url)) 22 | if options['delete']: 23 | try: 24 | duplicate_tags = image2.tags.all() 25 | image.tags.add(*duplicate_tags) 26 | image2.delete() 27 | delete_images+=1 28 | except IntegrityError: 29 | pass 30 | print("Deleted {} images".format(delete_images)) 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /stocksearch/crawlers/management/commands/script.py: -------------------------------------------------------------------------------- 1 | from django.core.management.base import BaseCommand, CommandError 2 | from crawlers.models import Image 3 | from django.db.utils import IntegrityError 4 | import pdb 5 | import requests 6 | 7 | class Command(BaseCommand): 8 | def add_arguments(self, parser): 9 | pass 10 | # Named (optional) arguments 11 | 12 | def handle(self, *args, **options): 13 | images = Image.objects.filter(origin='TP') 14 | deleted = 0 15 | for i, image in enumerate(images): 16 | response = requests.get(image.page_url) 17 | if 'This is a Premium Photo' in response.text: 18 | image.delete() 19 | deleted +=1 20 | print('deleted {} photos from tookapic'.format(deleted)) 21 | print('checking photo {} of {}'.format(i+1,len(images))) 22 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='Crawler', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, serialize=False, primary_key=True, verbose_name='ID')), 17 | ('origin', models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography')], max_length=2)), 18 | ('current_page', models.IntegerField(default=1)), 19 | ('images_scraped', models.IntegerField(default=0)), 20 | ], 21 | ), 22 | migrations.CreateModel( 23 | name='Image', 24 | fields=[ 25 | ('id', models.AutoField(auto_created=True, serialize=False, primary_key=True, verbose_name='ID')), 26 | ('source_url', models.URLField(max_length=400)), 27 | ('page_url', models.URLField(unique=True, max_length=400)), 28 | ('thumbnail', models.ImageField(null=True, upload_to='thumbs')), 29 | ('origin', models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography')], max_length=2)), 30 | ('hash', models.CharField(max_length=576)), 31 | ('hidden', models.BooleanField(default=False)), 32 | ], 33 | ), 34 | migrations.CreateModel( 35 | name='Tag', 36 | fields=[ 37 | ('id', models.AutoField(auto_created=True, serialize=False, primary_key=True, verbose_name='ID')), 38 | ('name', models.CharField(max_length=100)), 39 | ], 40 | ), 41 | migrations.AddField( 42 | model_name='image', 43 | name='tags', 44 | field=models.ManyToManyField(to='crawlers.Tag'), 45 | ), 46 | ] 47 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0002_auto_20151014_0126.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0002_auto_20151015_0134.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0003_auto_20151014_0304.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0002_auto_20151014_0126'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0003_auto_20151019_1422.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0002_auto_20151015_0134'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='SearchQuery', 16 | fields=[ 17 | ('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)), 18 | ('text', models.CharField(max_length=400)), 19 | ('amount', models.IntegerField(default=1)), 20 | ], 21 | ), 22 | migrations.AddField( 23 | model_name='image', 24 | name='clicks', 25 | field=models.IntegerField(default=0), 26 | ), 27 | migrations.AlterField( 28 | model_name='crawler', 29 | name='origin', 30 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX')]), 31 | ), 32 | migrations.AlterField( 33 | model_name='image', 34 | name='origin', 35 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX')]), 36 | ), 37 | ] 38 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0004_auto_20151014_0328.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0003_auto_20151014_0304'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0004_delete_searchquery.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0003_auto_20151019_1422'), 11 | ] 12 | 13 | operations = [ 14 | migrations.DeleteModel( 15 | name='SearchQuery', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0005_auto_20151014_1052.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0004_auto_20151014_0328'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0006_auto_20151014_1338.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0005_auto_20151014_1052'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0007_auto_20151014_2029.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0006_auto_20151014_1338'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0008_merge.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0002_auto_20151015_0134'), 11 | ('crawlers', '0007_auto_20151014_2029'), 12 | ] 13 | 14 | operations = [ 15 | ] 16 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0009_auto_20151016_2358.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0008_merge'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0010_auto_20151017_0310.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0009_auto_20151016_2358'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0011_merge.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0004_delete_searchquery'), 11 | ('crawlers', '0010_auto_20151017_0310'), 12 | ] 13 | 14 | operations = [ 15 | ] 16 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0012_auto_20151024_2000.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0011_merge'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0013_auto_20151030_2032.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0012_auto_20151024_2000'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0014_image_created.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | import datetime 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('crawlers', '0013_auto_20151030_2032'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='image', 17 | name='created', 18 | field=models.DateTimeField(default=datetime.datetime.now), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0015_auto_20151102_1855.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0014_image_created'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0016_auto_20151104_1539.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0015_auto_20151102_1855'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0017_auto_20151109_1056.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0016_auto_20151104_1539'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Url', 16 | fields=[ 17 | ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)), 18 | ('url', models.URLField(max_length=400)), 19 | ], 20 | ), 21 | migrations.AddField( 22 | model_name='crawler', 23 | name='visited_urls', 24 | field=models.ManyToManyField(to='crawlers.Url'), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0018_auto_20151109_1102.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0017_auto_20151109_1056'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='crawler', 16 | name='visited_urls', 17 | ), 18 | migrations.DeleteModel( 19 | name='Url', 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0019_auto_20151109_1112.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0018_auto_20151109_1102'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Url', 16 | fields=[ 17 | ('id', models.AutoField(verbose_name='ID', auto_created=True, serialize=False, primary_key=True)), 18 | ('url', models.URLField(max_length=400)), 19 | ], 20 | ), 21 | migrations.AddField( 22 | model_name='crawler', 23 | name='visited_urls', 24 | field=models.ManyToManyField(to='crawlers.Url'), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0020_auto_20160111_2145.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0019_auto_20151109_1112'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0021_auto_20160123_2359.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0020_auto_20160111_2145'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0022_auto_20160124_1345.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0021_auto_20160123_2359'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0023_auto_20160822_0204.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0022_auto_20160124_1345'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls'), ('SF', 'Stockified')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls'), ('SF', 'Stockified')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0024_auto_20160822_0238.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0023_auto_20160822_0204'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls'), ('SF', 'Stockified'), ('LG', 'LOOKING GLASS')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls'), ('SF', 'Stockified'), ('LG', 'LOOKING GLASS')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0025_auto_20160822_1248.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0024_auto_20160822_0238'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls'), ('SF', 'Stockified'), ('LG', 'LOOKING GLASS'), ('NP', 'nomad_pictures')], max_length=2), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls'), ('SF', 'Stockified'), ('LG', 'LOOKING GLASS'), ('NP', 'nomad_pictures')], max_length=2), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/0026_auto_20160822_1319.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('crawlers', '0025_auto_20160822_1248'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='crawler', 16 | name='origin', 17 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls'), ('SF', 'Stockified'), ('LG', 'LOOKING GLASS'), ('NP', 'nomad_pictures'), ('AP', 'AVOPIX')]), 18 | ), 19 | migrations.AlterField( 20 | model_name='image', 21 | name='origin', 22 | field=models.CharField(max_length=2, choices=[('PX', 'Pexels'), ('MG', 'Magdeleine'), ('FC', 'FancyCrave'), ('SS', 'StockSnap'), ('PB', 'PixaBay'), ('TP', 'tookapic'), ('KP', 'kaboompics'), ('PJ', 'picjumbo'), ('LS', 'LibreShot'), ('LV', 'Littlevisuals'), ('SP', 'SKITTERPHOTO'), ('JM', 'JayMantri'), ('MT', 'MMT'), ('FN', 'FreeNatureStock'), ('BA', 'BARA ART'), ('FP', 'Freely Photos'), ('BI', 'Barn Images'), ('GS', 'GoodStockPhotos'), ('IP', 'Finda Photo'), ('PG', 'Picography'), ('NS', 'Negative Space'), ('SH', 'SplitShire'), ('RS', 'Realistic Shots'), ('SW', 'StreetWill'), ('BF', 'Boss Fight'), ('LP', 'LIFE OF PIX'), ('PD', 'public domain archive'), ('BL', 'Bucketlistly Photos'), ('FB', 'Free Image Bank'), ('CV', 'CREATIVE VIX'), ('DP', 'DesignerPics'), ('FS', 'freestocks'), ('TC', 'travel coffee book'), ('FF', 'FOODIES FEED'), ('MS', 'My Stock Photos'), ('IR', 'ISO Republic'), ('JS', 'jeshoots'), ('SK', 'Stokpic'), ('JH', 'Joshua Hibbert'), ('MI', 'minimography'), ('IJ', 'Pickle Jar'), ('AI', 'alana.io'), ('PA', 'picalls'), ('SF', 'Stockified'), ('LG', 'LOOKING GLASS'), ('NP', 'nomad_pictures'), ('AP', 'AVOPIX')]), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /stocksearch/crawlers/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/crawlers/migrations/__init__.py -------------------------------------------------------------------------------- /stocksearch/crawlers/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.core.files import File 3 | import tempfile 4 | 5 | from PIL import Image as Imagelib, ImageOps 6 | from .blockhash import blockhash, blockhash_even 7 | import os 8 | from io import BytesIO 9 | import requests 10 | from django.db.models import Q 11 | 12 | from django.conf import settings as djangoSettings 13 | 14 | import pdb 15 | import time 16 | import datetime 17 | from .origins import origins 18 | 19 | 20 | class Tag(models.Model): 21 | name = models.CharField(max_length=100) 22 | 23 | def __str__(self): 24 | return self.name 25 | 26 | class ActiveManager(models.Manager): 27 | def get_queryset(self): 28 | return super(ActiveManager, self).get_queryset().all().exclude(Q(hidden=True) | Q(tags__isnull=True)) 29 | 30 | class Image(models.Model): 31 | 32 | source_url = models.URLField(max_length=400) 33 | page_url = models.URLField(unique=True, max_length=400) 34 | thumbnail = models.ImageField(upload_to='thumbs', null=True) 35 | origin = models.CharField(choices=origins, max_length=2) 36 | tags = models.ManyToManyField(Tag) 37 | hash = models.CharField(max_length=576) 38 | hidden = models.BooleanField(default=False) 39 | clicks = models.IntegerField(default=0) 40 | created = models.DateTimeField(default=datetime.datetime.now) 41 | 42 | active = ActiveManager() 43 | objects = models.Manager() 44 | 45 | def __str__(self): 46 | return self.page_url 47 | 48 | 49 | 50 | def create_hash(self): 51 | thumbnail = Imagelib.open(self.thumbnail.path) 52 | thumbnail = thumbnail.convert('RGB') 53 | hash = blockhash(thumbnail, 48) 54 | self.hash = hash 55 | self.save(update_fields=["hash"]) 56 | return hash 57 | 58 | def create_thumbnail(self, image_url): 59 | if not self.thumbnail: 60 | if not image_url: 61 | image_url = self.source_url 62 | headers = { 63 | 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36', 64 | } 65 | for i in range(5): 66 | try: 67 | r = requests.get(image_url, stream=True, headers=headers) 68 | r.raw.decode_content = True # handle spurious Content-Encoding 69 | except requests.exceptions.ConnectionError: 70 | print("error loading image url, connection error") 71 | break 72 | if r.status_code != 200 and r.status_code!= 304: 73 | print("error loading image url status code: {}".format(r.status_code)) 74 | time.sleep(2) 75 | else: 76 | break 77 | 78 | if r.status_code != 200 and r.status_code!= 304: 79 | print("giving up on this image, final status code: {}".format(r.status_code)) 80 | return False 81 | 82 | # Create the thumbnail of dimension size 83 | size = 500, 500 84 | img = Imagelib.open(r.raw) 85 | thumb = ImageOps.fit(img, size, Imagelib.ANTIALIAS) 86 | if thumb.mode == 'LA': 87 | print('image mode can\'t be LA') 88 | return False 89 | 90 | # Get the image name from the url 91 | img_name = os.path.basename(image_url.split('?', 1)[0]) 92 | 93 | 94 | file_path = os.path.join(djangoSettings.MEDIA_ROOT, "thumb" + img_name) 95 | thumb.save(file_path, 'JPEG') 96 | 97 | # Save the thumbnail in the media directory, prepend thumb 98 | self.thumbnail.save( 99 | img_name, 100 | File(open(file_path, 'rb'))) 101 | 102 | os.remove(file_path) 103 | return True 104 | 105 | class Url(models.Model): 106 | url = models.URLField(max_length=400) 107 | 108 | class Crawler(models.Model): 109 | origin = models.CharField(choices=origins, max_length=2) 110 | current_page = models.IntegerField(default=1) 111 | images_scraped = models.IntegerField(default=0) 112 | visited_urls = models.ManyToManyField(Url) 113 | 114 | def __str__(self): 115 | return self.get_origin_display()+" Crawler" 116 | 117 | 118 | -------------------------------------------------------------------------------- /stocksearch/crawlers/origins.py: -------------------------------------------------------------------------------- 1 | origins = ( 2 | ('PX', 'Pexels'), 3 | ('MG', 'Magdeleine'), 4 | ('FC', 'FancyCrave'), 5 | ('SS', 'StockSnap'), 6 | ('PB', 'PixaBay'), 7 | ('TP', 'tookapic'), 8 | ('KP', 'kaboompics'), 9 | ('PJ', 'picjumbo'), 10 | ('LS', 'LibreShot'), 11 | ('LV', 'Littlevisuals'), 12 | ('SP', 'SKITTERPHOTO'), 13 | ('JM', 'JayMantri'), 14 | ('MT','MMT'), 15 | ('FN','FreeNatureStock'), 16 | ('BA','BARA ART'), 17 | ('FP','Freely Photos'), 18 | ('BI','Barn Images'), 19 | ('GS','GoodStockPhotos'), 20 | ('IP','Finda Photo'), 21 | ('PG','Picography'), 22 | ('NS','Negative Space'), 23 | ('SH','SplitShire'), 24 | ('RS','Realistic Shots'), 25 | ('SW','StreetWill'), 26 | ('BF','Boss Fight'), 27 | ('LP','LIFE OF PIX'), 28 | ('PD','public domain archive'), 29 | ('BL','Bucketlistly Photos'), 30 | ('FB','Free Image Bank'), 31 | ('CV','CREATIVE VIX'), 32 | ('DP','DesignerPics'), 33 | ('FS','freestocks'), 34 | ('TC','travel coffee book'), 35 | ('FF','FOODIES FEED'), 36 | ('MS','My Stock Photos'), 37 | ('IR','ISO Republic'), 38 | ('JS','jeshoots'), 39 | ('SK','Stokpic'), 40 | ('JH','Joshua Hibbert'), 41 | ('MI','minimography'), 42 | ('IJ','Pickle Jar'), 43 | ('AI','alana.io'), 44 | ('PA','picalls'), 45 | ('SF','Stockified'), 46 | ('LG','LOOKING GLASS'), 47 | ('NP','nomad_pictures'), 48 | ('AP','AVOPIX'), 49 | ) 50 | -------------------------------------------------------------------------------- /stocksearch/crawlers/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /stocksearch/crawlers/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /stocksearch/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "stocksearch.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /stocksearch/static/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | 3 | .dashboard .module table th { 4 | width: 100%; 5 | } 6 | 7 | .dashboard .module table td { 8 | white-space: nowrap; 9 | } 10 | 11 | .dashboard .module table td a { 12 | display: block; 13 | padding-right: .6em; 14 | } 15 | 16 | /* RECENT ACTIONS MODULE */ 17 | 18 | .module ul.actionlist { 19 | margin-left: 0; 20 | } 21 | 22 | ul.actionlist li { 23 | list-style-type: none; 24 | } 25 | 26 | ul.actionlist li { 27 | overflow: hidden; 28 | text-overflow: ellipsis; 29 | -o-text-overflow: ellipsis; 30 | } 31 | -------------------------------------------------------------------------------- /stocksearch/static/admin/css/ie.css: -------------------------------------------------------------------------------- 1 | /* IE 6 & 7 */ 2 | 3 | /* Proper fixed width for dashboard in IE6 */ 4 | 5 | .dashboard #content { 6 | *width: 768px; 7 | } 8 | 9 | .dashboard #content-main { 10 | *width: 535px; 11 | } 12 | 13 | /* IE 6 ONLY */ 14 | 15 | /* Keep header from flowing off the page */ 16 | 17 | #container { 18 | _position: static; 19 | } 20 | 21 | /* Put the right sidebars back on the page */ 22 | 23 | .colMS #content-related { 24 | _margin-right: 0; 25 | _margin-left: 10px; 26 | _position: static; 27 | } 28 | 29 | /* Put the left sidebars back on the page */ 30 | 31 | .colSM #content-related { 32 | _margin-right: 10px; 33 | _margin-left: -115px; 34 | _position: static; 35 | } 36 | 37 | .form-row { 38 | _height: 1%; 39 | } 40 | 41 | /* Fix right margin for changelist filters in IE6 */ 42 | 43 | #changelist-filter ul { 44 | _margin-right: -10px; 45 | } 46 | 47 | /* IE ignores min-height, but treats height as if it were min-height */ 48 | 49 | .change-list .filtered { 50 | _height: 400px; 51 | } 52 | 53 | /* IE doesn't know alpha transparency in PNGs */ 54 | 55 | .inline-deletelink { 56 | background: transparent url(../img/inline-delete-8bit.png) no-repeat; 57 | } 58 | 59 | /* IE7 doesn't support inline-block */ 60 | .change-list ul.toplinks li { 61 | zoom: 1; 62 | *display: inline; 63 | } 64 | -------------------------------------------------------------------------------- /stocksearch/static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | body.login { 4 | background: #eee; 5 | } 6 | 7 | .login #container { 8 | background: white; 9 | border: 1px solid #ccc; 10 | width: 28em; 11 | min-width: 300px; 12 | margin-left: auto; 13 | margin-right: auto; 14 | margin-top: 100px; 15 | } 16 | 17 | .login #content-main { 18 | width: 100%; 19 | } 20 | 21 | .login form { 22 | margin-top: 1em; 23 | } 24 | 25 | .login .form-row { 26 | padding: 4px 0; 27 | float: left; 28 | width: 100%; 29 | } 30 | 31 | .login .form-row label { 32 | padding-right: 0.5em; 33 | line-height: 2em; 34 | font-size: 1em; 35 | clear: both; 36 | color: #333; 37 | } 38 | 39 | .login .form-row #id_username, .login .form-row #id_password { 40 | clear: both; 41 | padding: 6px; 42 | width: 100%; 43 | -webkit-box-sizing: border-box; 44 | -moz-box-sizing: border-box; 45 | box-sizing: border-box; 46 | } 47 | 48 | .login span.help { 49 | font-size: 10px; 50 | display: block; 51 | } 52 | 53 | .login .submit-row { 54 | clear: both; 55 | padding: 1em 0 0 9.4em; 56 | } 57 | 58 | .login .password-reset-link { 59 | text-align: center; 60 | } 61 | -------------------------------------------------------------------------------- /stocksearch/static/admin/css/rtl.css: -------------------------------------------------------------------------------- 1 | body { 2 | direction: rtl; 3 | } 4 | 5 | /* LOGIN */ 6 | 7 | .login .form-row { 8 | float: right; 9 | } 10 | 11 | .login .form-row label { 12 | float: right; 13 | padding-left: 0.5em; 14 | padding-right: 0; 15 | text-align: left; 16 | } 17 | 18 | .login .submit-row { 19 | clear: both; 20 | padding: 1em 9.4em 0 0; 21 | } 22 | 23 | /* GLOBAL */ 24 | 25 | th { 26 | text-align: right; 27 | } 28 | 29 | .module h2, .module caption { 30 | text-align: right; 31 | } 32 | 33 | .addlink, .changelink { 34 | padding-left: 0px; 35 | padding-right: 12px; 36 | background-position: 100% 0.2em; 37 | } 38 | 39 | .deletelink { 40 | padding-left: 0px; 41 | padding-right: 12px; 42 | background-position: 100% 0.25em; 43 | } 44 | 45 | .object-tools { 46 | float: left; 47 | } 48 | 49 | thead th:first-child, 50 | tfoot td:first-child { 51 | border-left: 1px solid #ddd !important; 52 | } 53 | 54 | /* LAYOUT */ 55 | 56 | #user-tools { 57 | right: auto; 58 | left: 0; 59 | text-align: left; 60 | } 61 | 62 | div.breadcrumbs { 63 | text-align: right; 64 | } 65 | 66 | #content-main { 67 | float: right; 68 | } 69 | 70 | #content-related { 71 | float: left; 72 | margin-left: -19em; 73 | margin-right: auto; 74 | } 75 | 76 | .colMS { 77 | margin-left: 20em !important; 78 | margin-right: 10px !important; 79 | } 80 | 81 | /* SORTABLE TABLES */ 82 | 83 | table thead th.sorted .sortoptions { 84 | float: left; 85 | } 86 | 87 | thead th.sorted .text { 88 | padding-right: 0; 89 | padding-left: 42px; 90 | } 91 | 92 | /* dashboard styles */ 93 | 94 | .dashboard .module table td a { 95 | padding-left: .6em; 96 | padding-right: 12px; 97 | } 98 | 99 | /* changelists styles */ 100 | 101 | .change-list .filtered { 102 | background: white url(../img/changelist-bg_rtl.gif) top left repeat-y !important; 103 | } 104 | 105 | .change-list .filtered table { 106 | border-left: 1px solid #ddd; 107 | border-right: 0px none; 108 | } 109 | 110 | #changelist-filter { 111 | right: auto; 112 | left: 0; 113 | border-left: 0px none; 114 | border-right: 1px solid #ddd; 115 | } 116 | 117 | .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { 118 | margin-right: 0px !important; 119 | margin-left: 160px !important; 120 | } 121 | 122 | #changelist-filter li.selected { 123 | border-left: 0px none; 124 | padding-left: 0px; 125 | margin-left: 0; 126 | border-right: 5px solid #ccc; 127 | padding-right: 5px; 128 | margin-right: -10px; 129 | } 130 | 131 | .filtered .actions { 132 | border-left:1px solid #DDDDDD; 133 | margin-left:160px !important; 134 | border-right: 0 none; 135 | margin-right:0 !important; 136 | } 137 | 138 | #changelist table tbody td:first-child, #changelist table tbody th:first-child { 139 | border-right: 0; 140 | border-left: 1px solid #ddd; 141 | } 142 | 143 | /* FORMS */ 144 | 145 | .aligned label { 146 | padding: 0 0 3px 1em; 147 | float: right; 148 | } 149 | 150 | .submit-row { 151 | text-align: left 152 | } 153 | 154 | .submit-row p.deletelink-box { 155 | float: right; 156 | } 157 | 158 | .submit-row .deletelink { 159 | background: url(../img/icon_deletelink.gif) 0 50% no-repeat; 160 | padding-right: 14px; 161 | } 162 | 163 | .vDateField, .vTimeField { 164 | margin-left: 2px; 165 | } 166 | 167 | form ul.inline li { 168 | float: right; 169 | padding-right: 0; 170 | padding-left: 7px; 171 | } 172 | 173 | input[type=submit].default, .submit-row input.default { 174 | float: left; 175 | } 176 | 177 | fieldset .field-box { 178 | float: right; 179 | margin-left: 20px; 180 | margin-right: 0; 181 | } 182 | 183 | .errorlist li { 184 | background-position: 100% .3em; 185 | padding: 4px 25px 4px 5px; 186 | } 187 | 188 | .errornote { 189 | background-position: 100% .3em; 190 | padding: 4px 25px 4px 5px; 191 | } 192 | 193 | /* WIDGETS */ 194 | 195 | .calendarnav-previous { 196 | top: 0; 197 | left: auto; 198 | right: 0; 199 | } 200 | 201 | .calendarnav-next { 202 | top: 0; 203 | right: auto; 204 | left: 0; 205 | } 206 | 207 | .calendar caption, .calendarbox h2 { 208 | text-align: center; 209 | } 210 | 211 | .selector { 212 | float: right; 213 | } 214 | 215 | .selector .selector-filter { 216 | text-align: right; 217 | } 218 | 219 | .inline-deletelink { 220 | float: left; 221 | } 222 | 223 | /* MISC */ 224 | 225 | .inline-related h2, .inline-group h2 { 226 | text-align: right 227 | } 228 | 229 | .inline-related h3 span.delete { 230 | padding-right: 20px; 231 | padding-left: inherit; 232 | left: 10px; 233 | right: inherit; 234 | float:left; 235 | } 236 | 237 | .inline-related h3 span.delete label { 238 | margin-left: inherit; 239 | margin-right: 2px; 240 | } 241 | 242 | /* IE7 specific bug fixes */ 243 | 244 | div.colM { 245 | position: relative; 246 | } 247 | 248 | .submit-row input { 249 | float: left; 250 | } 251 | -------------------------------------------------------------------------------- /stocksearch/static/admin/img/changelist-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/changelist-bg.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/changelist-bg_rtl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/changelist-bg_rtl.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/default-bg-reverse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/default-bg-reverse.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/default-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/default-bg.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/deleted-overlay.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/deleted-overlay.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/gis/move_vertex_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/gis/move_vertex_off.png -------------------------------------------------------------------------------- /stocksearch/static/admin/img/gis/move_vertex_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/gis/move_vertex_on.png -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon-no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon-no.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon-unknown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon-unknown.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon-yes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon-yes.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_addlink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_addlink.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_alert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_alert.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_calendar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_calendar.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_changelink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_changelink.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_clock.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_clock.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_deletelink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_deletelink.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_error.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_error.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_searchbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_searchbox.png -------------------------------------------------------------------------------- /stocksearch/static/admin/img/icon_success.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/icon_success.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/inline-delete-8bit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/inline-delete-8bit.png -------------------------------------------------------------------------------- /stocksearch/static/admin/img/inline-delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/inline-delete.png -------------------------------------------------------------------------------- /stocksearch/static/admin/img/inline-restore-8bit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/inline-restore-8bit.png -------------------------------------------------------------------------------- /stocksearch/static/admin/img/inline-restore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/inline-restore.png -------------------------------------------------------------------------------- /stocksearch/static/admin/img/inline-splitter-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/inline-splitter-bg.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/nav-bg-grabber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/nav-bg-grabber.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/nav-bg-reverse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/nav-bg-reverse.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/nav-bg-selected.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/nav-bg-selected.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/nav-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/nav-bg.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/selector-icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/selector-icons.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/selector-search.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/selector-search.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/sorting-icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/sorting-icons.gif -------------------------------------------------------------------------------- /stocksearch/static/admin/img/tooltag-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/tooltag-add.png -------------------------------------------------------------------------------- /stocksearch/static/admin/img/tooltag-arrowright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davegri/StockSearch/c5feb429d4c1c5f5c301849b5a09f3099e97fb8f/stocksearch/static/admin/img/tooltag-arrowright.png -------------------------------------------------------------------------------- /stocksearch/static/admin/js/LICENSE-JQUERY.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010 John Resig, http://jquery.com/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /stocksearch/static/admin/js/SelectBox.js: -------------------------------------------------------------------------------- 1 | var SelectBox = { 2 | cache: new Object(), 3 | init: function(id) { 4 | var box = document.getElementById(id); 5 | var node; 6 | SelectBox.cache[id] = new Array(); 7 | var cache = SelectBox.cache[id]; 8 | for (var i = 0; (node = box.options[i]); i++) { 9 | cache.push({value: node.value, text: node.text, displayed: 1}); 10 | } 11 | }, 12 | redisplay: function(id) { 13 | // Repopulate HTML select box from cache 14 | var box = document.getElementById(id); 15 | box.options.length = 0; // clear all options 16 | for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) { 17 | var node = SelectBox.cache[id][i]; 18 | if (node.displayed) { 19 | var new_option = new Option(node.text, node.value, false, false); 20 | // Shows a tooltip when hovering over the option 21 | new_option.setAttribute("title", node.text); 22 | box.options[box.options.length] = new_option; 23 | } 24 | } 25 | }, 26 | filter: function(id, text) { 27 | // Redisplay the HTML select box, displaying only the choices containing ALL 28 | // the words in text. (It's an AND search.) 29 | var tokens = text.toLowerCase().split(/\s+/); 30 | var node, token; 31 | for (var i = 0; (node = SelectBox.cache[id][i]); i++) { 32 | node.displayed = 1; 33 | for (var j = 0; (token = tokens[j]); j++) { 34 | if (node.text.toLowerCase().indexOf(token) == -1) { 35 | node.displayed = 0; 36 | } 37 | } 38 | } 39 | SelectBox.redisplay(id); 40 | }, 41 | delete_from_cache: function(id, value) { 42 | var node, delete_index = null; 43 | for (var i = 0; (node = SelectBox.cache[id][i]); i++) { 44 | if (node.value == value) { 45 | delete_index = i; 46 | break; 47 | } 48 | } 49 | var j = SelectBox.cache[id].length - 1; 50 | for (var i = delete_index; i < j; i++) { 51 | SelectBox.cache[id][i] = SelectBox.cache[id][i+1]; 52 | } 53 | SelectBox.cache[id].length--; 54 | }, 55 | add_to_cache: function(id, option) { 56 | SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); 57 | }, 58 | cache_contains: function(id, value) { 59 | // Check if an item is contained in the cache 60 | var node; 61 | for (var i = 0; (node = SelectBox.cache[id][i]); i++) { 62 | if (node.value == value) { 63 | return true; 64 | } 65 | } 66 | return false; 67 | }, 68 | move: function(from, to) { 69 | var from_box = document.getElementById(from); 70 | var to_box = document.getElementById(to); 71 | var option; 72 | for (var i = 0; (option = from_box.options[i]); i++) { 73 | if (option.selected && SelectBox.cache_contains(from, option.value)) { 74 | SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1}); 75 | SelectBox.delete_from_cache(from, option.value); 76 | } 77 | } 78 | SelectBox.redisplay(from); 79 | SelectBox.redisplay(to); 80 | }, 81 | move_all: function(from, to) { 82 | var from_box = document.getElementById(from); 83 | var to_box = document.getElementById(to); 84 | var option; 85 | for (var i = 0; (option = from_box.options[i]); i++) { 86 | if (SelectBox.cache_contains(from, option.value)) { 87 | SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1}); 88 | SelectBox.delete_from_cache(from, option.value); 89 | } 90 | } 91 | SelectBox.redisplay(from); 92 | SelectBox.redisplay(to); 93 | }, 94 | sort: function(id) { 95 | SelectBox.cache[id].sort( function(a, b) { 96 | a = a.text.toLowerCase(); 97 | b = b.text.toLowerCase(); 98 | try { 99 | if (a > b) return 1; 100 | if (a < b) return -1; 101 | } 102 | catch (e) { 103 | // silently fail on IE 'unknown' exception 104 | } 105 | return 0; 106 | } ); 107 | }, 108 | select_all: function(id) { 109 | var box = document.getElementById(id); 110 | for (var i = 0; i < box.options.length; i++) { 111 | box.options[i].selected = 'selected'; 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/actions.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | var lastChecked; 3 | 4 | $.fn.actions = function(opts) { 5 | var options = $.extend({}, $.fn.actions.defaults, opts); 6 | var actionCheckboxes = $(this); 7 | var list_editable_changed = false; 8 | var checker = function(checked) { 9 | if (checked) { 10 | showQuestion(); 11 | } else { 12 | reset(); 13 | } 14 | $(actionCheckboxes).prop("checked", checked) 15 | .parent().parent().toggleClass(options.selectedClass, checked); 16 | }, 17 | updateCounter = function() { 18 | var sel = $(actionCheckboxes).filter(":checked").length; 19 | // _actions_icnt is defined in the generated HTML 20 | // and contains the total amount of objects in the queryset 21 | $(options.counterContainer).html(interpolate( 22 | ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { 23 | sel: sel, 24 | cnt: _actions_icnt 25 | }, true)); 26 | $(options.allToggle).prop("checked", function() { 27 | var value; 28 | if (sel == actionCheckboxes.length) { 29 | value = true; 30 | showQuestion(); 31 | } else { 32 | value = false; 33 | clearAcross(); 34 | } 35 | return value; 36 | }); 37 | }, 38 | showQuestion = function() { 39 | $(options.acrossClears).hide(); 40 | $(options.acrossQuestions).show(); 41 | $(options.allContainer).hide(); 42 | }, 43 | showClear = function() { 44 | $(options.acrossClears).show(); 45 | $(options.acrossQuestions).hide(); 46 | $(options.actionContainer).toggleClass(options.selectedClass); 47 | $(options.allContainer).show(); 48 | $(options.counterContainer).hide(); 49 | }, 50 | reset = function() { 51 | $(options.acrossClears).hide(); 52 | $(options.acrossQuestions).hide(); 53 | $(options.allContainer).hide(); 54 | $(options.counterContainer).show(); 55 | }, 56 | clearAcross = function() { 57 | reset(); 58 | $(options.acrossInput).val(0); 59 | $(options.actionContainer).removeClass(options.selectedClass); 60 | }; 61 | // Show counter by default 62 | $(options.counterContainer).show(); 63 | // Check state of checkboxes and reinit state if needed 64 | $(this).filter(":checked").each(function(i) { 65 | $(this).parent().parent().toggleClass(options.selectedClass); 66 | updateCounter(); 67 | if ($(options.acrossInput).val() == 1) { 68 | showClear(); 69 | } 70 | }); 71 | $(options.allToggle).show().click(function() { 72 | checker($(this).prop("checked")); 73 | updateCounter(); 74 | }); 75 | $("a", options.acrossQuestions).click(function(event) { 76 | event.preventDefault(); 77 | $(options.acrossInput).val(1); 78 | showClear(); 79 | }); 80 | $("a", options.acrossClears).click(function(event) { 81 | event.preventDefault(); 82 | $(options.allToggle).prop("checked", false); 83 | clearAcross(); 84 | checker(0); 85 | updateCounter(); 86 | }); 87 | lastChecked = null; 88 | $(actionCheckboxes).click(function(event) { 89 | if (!event) { event = window.event; } 90 | var target = event.target ? event.target : event.srcElement; 91 | if (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey === true) { 92 | var inrange = false; 93 | $(lastChecked).prop("checked", target.checked) 94 | .parent().parent().toggleClass(options.selectedClass, target.checked); 95 | $(actionCheckboxes).each(function() { 96 | if ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) { 97 | inrange = (inrange) ? false : true; 98 | } 99 | if (inrange) { 100 | $(this).prop("checked", target.checked) 101 | .parent().parent().toggleClass(options.selectedClass, target.checked); 102 | } 103 | }); 104 | } 105 | $(target).parent().parent().toggleClass(options.selectedClass, target.checked); 106 | lastChecked = target; 107 | updateCounter(); 108 | }); 109 | $('form#changelist-form table#result_list tr').find('td:gt(0) :input').change(function() { 110 | list_editable_changed = true; 111 | }); 112 | $('form#changelist-form button[name="index"]').click(function(event) { 113 | if (list_editable_changed) { 114 | return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); 115 | } 116 | }); 117 | $('form#changelist-form input[name="_save"]').click(function(event) { 118 | var action_changed = false; 119 | $('select option:selected', options.actionContainer).each(function() { 120 | if ($(this).val()) { 121 | action_changed = true; 122 | } 123 | }); 124 | if (action_changed) { 125 | if (list_editable_changed) { 126 | return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")); 127 | } else { 128 | return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button.")); 129 | } 130 | } 131 | }); 132 | }; 133 | /* Setup plugin defaults */ 134 | $.fn.actions.defaults = { 135 | actionContainer: "div.actions", 136 | counterContainer: "span.action-counter", 137 | allContainer: "div.actions span.all", 138 | acrossInput: "div.actions input.select-across", 139 | acrossQuestions: "div.actions span.question", 140 | acrossClears: "div.actions span.clear", 141 | allToggle: "#action-toggle", 142 | selectedClass: "selected" 143 | }; 144 | })(django.jQuery); 145 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/actions.min.js: -------------------------------------------------------------------------------- 1 | (function(a){var f;a.fn.actions=function(q){var b=a.extend({},a.fn.actions.defaults,q),g=a(this),e=!1,m=function(c){c?k():l();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length;a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:_actions_icnt},!0));a(b.allToggle).prop("checked",function(){var a;c==g.length?(a=!0,k()):(a=!1,n());return a})},k=function(){a(b.acrossClears).hide(); 2 | a(b.acrossQuestions).show();a(b.allContainer).hide()},p=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},l=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},n=function(){l();a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)};a(b.counterContainer).show();a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass); 3 | h();1==a(b.acrossInput).val()&&p()});a(b.allToggle).show().click(function(){m(a(this).prop("checked"));h()});a("a",b.acrossQuestions).click(function(c){c.preventDefault();a(b.acrossInput).val(1);p()});a("a",b.acrossClears).click(function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);n();m(0);h()});f=null;a(g).click(function(c){c||(c=window.event);var d=c.target?c.target:c.srcElement;if(f&&a.data(f)!=a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass, 4 | d.checked);a(g).each(function(){if(a.data(this)==a.data(f)||a.data(this)==a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").find("td:gt(0) :input").change(function(){e=!0});a('form#changelist-form button[name="index"]').click(function(a){if(e)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))}); 5 | a('form#changelist-form input[name="_save"]').click(function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return e?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")):confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})}; 6 | a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"}})(django.jQuery); 7 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/admin/RelatedObjectLookups.js: -------------------------------------------------------------------------------- 1 | // Handles related-objects functionality: lookup link for raw_id_fields 2 | // and Add Another links. 3 | 4 | function html_unescape(text) { 5 | // Unescape a string that was escaped using django.utils.html.escape. 6 | text = text.replace(/</g, '<'); 7 | text = text.replace(/>/g, '>'); 8 | text = text.replace(/"/g, '"'); 9 | text = text.replace(/'/g, "'"); 10 | text = text.replace(/&/g, '&'); 11 | return text; 12 | } 13 | 14 | // IE doesn't accept periods or dashes in the window name, but the element IDs 15 | // we use to generate popup window names may contain them, therefore we map them 16 | // to allowed characters in a reversible way so that we can locate the correct 17 | // element when the popup window is dismissed. 18 | function id_to_windowname(text) { 19 | text = text.replace(/\./g, '__dot__'); 20 | text = text.replace(/\-/g, '__dash__'); 21 | return text; 22 | } 23 | 24 | function windowname_to_id(text) { 25 | text = text.replace(/__dot__/g, '.'); 26 | text = text.replace(/__dash__/g, '-'); 27 | return text; 28 | } 29 | 30 | function showAdminPopup(triggeringLink, name_regexp) { 31 | var name = triggeringLink.id.replace(name_regexp, ''); 32 | name = id_to_windowname(name); 33 | var href = triggeringLink.href; 34 | if (href.indexOf('?') == -1) { 35 | href += '?_popup=1'; 36 | } else { 37 | href += '&_popup=1'; 38 | } 39 | var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); 40 | win.focus(); 41 | return false; 42 | } 43 | 44 | function showRelatedObjectLookupPopup(triggeringLink) { 45 | return showAdminPopup(triggeringLink, /^lookup_/); 46 | } 47 | 48 | function dismissRelatedLookupPopup(win, chosenId) { 49 | var name = windowname_to_id(win.name); 50 | var elem = document.getElementById(name); 51 | if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) { 52 | elem.value += ',' + chosenId; 53 | } else { 54 | document.getElementById(name).value = chosenId; 55 | } 56 | win.close(); 57 | } 58 | 59 | function showRelatedObjectPopup(triggeringLink) { 60 | var name = triggeringLink.id.replace(/^(change|add|delete)_/, ''); 61 | name = id_to_windowname(name); 62 | var href = triggeringLink.href; 63 | var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); 64 | win.focus(); 65 | return false; 66 | } 67 | 68 | function dismissAddRelatedObjectPopup(win, newId, newRepr) { 69 | // newId and newRepr are expected to have previously been escaped by 70 | // django.utils.html.escape. 71 | newId = html_unescape(newId); 72 | newRepr = html_unescape(newRepr); 73 | var name = windowname_to_id(win.name); 74 | var elem = document.getElementById(name); 75 | var o; 76 | if (elem) { 77 | var elemName = elem.nodeName.toUpperCase(); 78 | if (elemName == 'SELECT') { 79 | o = new Option(newRepr, newId); 80 | elem.options[elem.options.length] = o; 81 | o.selected = true; 82 | } else if (elemName == 'INPUT') { 83 | if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) { 84 | elem.value += ',' + newId; 85 | } else { 86 | elem.value = newId; 87 | } 88 | } 89 | // Trigger a change event to update related links if required. 90 | django.jQuery(elem).trigger('change'); 91 | } else { 92 | var toId = name + "_to"; 93 | o = new Option(newRepr, newId); 94 | SelectBox.add_to_cache(toId, o); 95 | SelectBox.redisplay(toId); 96 | } 97 | win.close(); 98 | } 99 | 100 | function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { 101 | objId = html_unescape(objId); 102 | newRepr = html_unescape(newRepr); 103 | var id = windowname_to_id(win.name).replace(/^edit_/, ''); 104 | var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); 105 | var selects = django.jQuery(selectsSelector); 106 | selects.find('option').each(function() { 107 | if (this.value == objId) { 108 | this.innerHTML = newRepr; 109 | this.value = newId; 110 | } 111 | }); 112 | win.close(); 113 | }; 114 | 115 | function dismissDeleteRelatedObjectPopup(win, objId) { 116 | objId = html_unescape(objId); 117 | var id = windowname_to_id(win.name).replace(/^delete_/, ''); 118 | var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); 119 | var selects = django.jQuery(selectsSelector); 120 | selects.find('option').each(function() { 121 | if (this.value == objId) { 122 | django.jQuery(this).remove(); 123 | } 124 | }).trigger('change'); 125 | win.close(); 126 | }; 127 | 128 | // Kept for backward compatibility 129 | showAddAnotherPopup = showRelatedObjectPopup; 130 | dismissAddAnotherPopup = dismissAddRelatedObjectPopup; 131 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/collapse.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | $(document).ready(function() { 3 | // Add anchor tag for Show/Hide link 4 | $("fieldset.collapse").each(function(i, elem) { 5 | // Don't hide if fields in this fieldset have errors 6 | if ($(elem).find("div.errors").length == 0) { 7 | $(elem).addClass("collapsed").find("h2").first().append(' (' + gettext("Show") + 9 | ')'); 10 | } 11 | }); 12 | // Add toggle to anchor tag 13 | $("fieldset.collapse a.collapse-toggle").click(function(ev) { 14 | if ($(this).closest("fieldset").hasClass("collapsed")) { 15 | // Show 16 | $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]); 17 | } else { 18 | // Hide 19 | $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]); 20 | } 21 | return false; 22 | }); 23 | }); 24 | })(django.jQuery); 25 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/collapse.min.js: -------------------------------------------------------------------------------- 1 | (function(a){a(document).ready(function(){a("fieldset.collapse").each(function(c,b){a(b).find("div.errors").length==0&&a(b).addClass("collapsed").find("h2").first().append(' ('+gettext("Show")+")")});a("fieldset.collapse a.collapse-toggle").click(function(){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", 2 | [a(this).attr("id")]);return false})})})(django.jQuery); 3 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/inlines.min.js: -------------------------------------------------------------------------------- 1 | (function(a){a.fn.formset=function(g){var b=a.extend({},a.fn.formset.defaults,g),i=a(this);g=i.parent();var m=function(e,k,h){var j=RegExp("("+k+"-(\\d+|__prefix__))");k=k+"-"+h;a(e).prop("for")&&a(e).prop("for",a(e).prop("for").replace(j,k));if(e.id)e.id=e.id.replace(j,k);if(e.name)e.name=e.name.replace(j,k)},l=a("#id_"+b.prefix+"-TOTAL_FORMS").prop("autocomplete","off"),d=parseInt(l.val(),10),c=a("#id_"+b.prefix+"-MAX_NUM_FORMS").prop("autocomplete","off");l=c.val()===""||c.val()-l.val()>0;i.each(function(){a(this).not("."+ 2 | b.emptyCssClass).addClass(b.formCssClass)});if(i.length&&l){var f;if(i.prop("tagName")=="TR"){i=this.eq(-1).children().length;g.append(''+b.addText+"");f=g.find("tr:last a")}else{i.filter(":last").after('");f=i.filter(":last").next().find("a")}f.click(function(e){e.preventDefault();var k=a("#id_"+b.prefix+"-TOTAL_FORMS");e=a("#"+ 3 | b.prefix+"-empty");var h=e.clone(true);h.removeClass(b.emptyCssClass).addClass(b.formCssClass).attr("id",b.prefix+"-"+d);if(h.is("tr"))h.children(":last").append('
'+b.deleteText+"
");else h.is("ul")||h.is("ol")?h.append('
  • '+b.deleteText+"
  • "):h.children(":first").append(''+b.deleteText+""); 4 | h.find("*").each(function(){m(this,b.prefix,k.val())});h.insertBefore(a(e));a(k).val(parseInt(k.val(),10)+1);d+=1;c.val()!==""&&c.val()-k.val()<=0&&f.parent().hide();h.find("a."+b.deleteCssClass).click(function(j){j.preventDefault();j=a(this).parents("."+b.formCssClass);j.remove();d-=1;b.removed&&b.removed(j);j=a("."+b.formCssClass);a("#id_"+b.prefix+"-TOTAL_FORMS").val(j.length);if(c.val()===""||c.val()-j.length>0)f.parent().show();for(var n=0,o=j.length;n 0) { 23 | values.push(field.val()); 24 | } 25 | }); 26 | prepopulatedField.val(URLify(values.join(' '), maxLength)); 27 | }; 28 | 29 | prepopulatedField.data('_changed', false); 30 | prepopulatedField.change(function() { 31 | prepopulatedField.data('_changed', true); 32 | }); 33 | 34 | if (!prepopulatedField.val()) { 35 | $(dependencies.join(',')).keyup(populate).change(populate).focus(populate); 36 | } 37 | }); 38 | }; 39 | })(django.jQuery); 40 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/prepopulate.min.js: -------------------------------------------------------------------------------- 1 | (function(b){b.fn.prepopulate=function(e,g){return this.each(function(){var a=b(this),d=function(){if(!a.data("_changed")){var f=[];b.each(e,function(h,c){c=b(c);c.val().length>0&&f.push(c.val())});a.val(URLify(f.join(" "),g))}};a.data("_changed",false);a.change(function(){a.data("_changed",true)});a.val()||b(e.join(",")).keyup(d).change(d).focus(d)})}})(django.jQuery); 2 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/related-widget-wrapper.js: -------------------------------------------------------------------------------- 1 | django.jQuery(function($){ 2 | function updateLinks() { 3 | var $this = $(this); 4 | var siblings = $this.nextAll('.change-related, .delete-related'); 5 | if (!siblings.length) return; 6 | var value = $this.val(); 7 | if (value) { 8 | siblings.each(function(){ 9 | var elm = $(this); 10 | elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); 11 | }); 12 | } else siblings.removeAttr('href'); 13 | } 14 | var container = $(document); 15 | container.on('change', '.related-widget-wrapper select', updateLinks); 16 | container.find('.related-widget-wrapper select').each(updateLinks); 17 | container.on('click', '.related-widget-wrapper-link', function(event){ 18 | if (this.href) { 19 | showRelatedObjectPopup(this); 20 | } 21 | event.preventDefault(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/timeparse.js: -------------------------------------------------------------------------------- 1 | var timeParsePatterns = [ 2 | // 9 3 | { re: /^\d{1,2}$/i, 4 | handler: function(bits) { 5 | if (bits[0].length == 1) { 6 | return '0' + bits[0] + ':00'; 7 | } else { 8 | return bits[0] + ':00'; 9 | } 10 | } 11 | }, 12 | // 13:00 13 | { re: /^\d{2}[:.]\d{2}$/i, 14 | handler: function(bits) { 15 | return bits[0].replace('.', ':'); 16 | } 17 | }, 18 | // 9:00 19 | { re: /^\d[:.]\d{2}$/i, 20 | handler: function(bits) { 21 | return '0' + bits[0].replace('.', ':'); 22 | } 23 | }, 24 | // 3 am / 3 a.m. / 3am 25 | { re: /^(\d+)\s*([ap])(?:.?m.?)?$/i, 26 | handler: function(bits) { 27 | var hour = parseInt(bits[1]); 28 | if (hour == 12) { 29 | hour = 0; 30 | } 31 | if (bits[2].toLowerCase() == 'p') { 32 | if (hour == 12) { 33 | hour = 0; 34 | } 35 | return (hour + 12) + ':00'; 36 | } else { 37 | if (hour < 10) { 38 | return '0' + hour + ':00'; 39 | } else { 40 | return hour + ':00'; 41 | } 42 | } 43 | } 44 | }, 45 | // 3.30 am / 3:15 a.m. / 3.00am 46 | { re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i, 47 | handler: function(bits) { 48 | var hour = parseInt(bits[1]); 49 | var mins = parseInt(bits[2]); 50 | if (mins < 10) { 51 | mins = '0' + mins; 52 | } 53 | if (hour == 12) { 54 | hour = 0; 55 | } 56 | if (bits[3].toLowerCase() == 'p') { 57 | if (hour == 12) { 58 | hour = 0; 59 | } 60 | return (hour + 12) + ':' + mins; 61 | } else { 62 | if (hour < 10) { 63 | return '0' + hour + ':' + mins; 64 | } else { 65 | return hour + ':' + mins; 66 | } 67 | } 68 | } 69 | }, 70 | // noon 71 | { re: /^no/i, 72 | handler: function(bits) { 73 | return '12:00'; 74 | } 75 | }, 76 | // midnight 77 | { re: /^mid/i, 78 | handler: function(bits) { 79 | return '00:00'; 80 | } 81 | } 82 | ]; 83 | 84 | function parseTimeString(s) { 85 | for (var i = 0; i < timeParsePatterns.length; i++) { 86 | var re = timeParsePatterns[i].re; 87 | var handler = timeParsePatterns[i].handler; 88 | var bits = re.exec(s); 89 | if (bits) { 90 | return handler(bits); 91 | } 92 | } 93 | return s; 94 | } 95 | -------------------------------------------------------------------------------- /stocksearch/static/admin/js/urlify.js: -------------------------------------------------------------------------------- 1 | var LATIN_MAP = { 2 | 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç': 3 | 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I', 4 | 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 5 | 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U', 6 | 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 7 | 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 8 | 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 9 | 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 10 | 'ú': 'u', 'û': 'u', 'ü': 'u', 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' 11 | }; 12 | var LATIN_SYMBOLS_MAP = { 13 | '©':'(c)' 14 | }; 15 | var GREEK_MAP = { 16 | 'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8', 17 | 'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p', 18 | 'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w', 19 | 'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s', 20 | 'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i', 21 | 'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8', 22 | 'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P', 23 | 'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W', 24 | 'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I', 25 | 'Ϋ':'Y' 26 | }; 27 | var TURKISH_MAP = { 28 | 'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U', 29 | 'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G' 30 | }; 31 | var RUSSIAN_MAP = { 32 | 'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh', 33 | 'з':'z', 'и':'i', 'й':'j', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o', 34 | 'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c', 35 | 'ч':'ch', 'ш':'sh', 'щ':'sh', 'ъ':'', 'ы':'y', 'ь':'', 'э':'e', 'ю':'yu', 36 | 'я':'ya', 37 | 'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ё':'Yo', 'Ж':'Zh', 38 | 'З':'Z', 'И':'I', 'Й':'J', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O', 39 | 'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Х':'H', 'Ц':'C', 40 | 'Ч':'Ch', 'Ш':'Sh', 'Щ':'Sh', 'Ъ':'', 'Ы':'Y', 'Ь':'', 'Э':'E', 'Ю':'Yu', 41 | 'Я':'Ya' 42 | }; 43 | var UKRAINIAN_MAP = { 44 | 'Є':'Ye', 'І':'I', 'Ї':'Yi', 'Ґ':'G', 'є':'ye', 'і':'i', 'ї':'yi', 'ґ':'g' 45 | }; 46 | var CZECH_MAP = { 47 | 'č':'c', 'ď':'d', 'ě':'e', 'ň': 'n', 'ř':'r', 'š':'s', 'ť':'t', 'ů':'u', 48 | 'ž':'z', 'Č':'C', 'Ď':'D', 'Ě':'E', 'Ň': 'N', 'Ř':'R', 'Š':'S', 'Ť':'T', 49 | 'Ů':'U', 'Ž':'Z' 50 | }; 51 | var POLISH_MAP = { 52 | 'ą':'a', 'ć':'c', 'ę':'e', 'ł':'l', 'ń':'n', 'ó':'o', 'ś':'s', 'ź':'z', 53 | 'ż':'z', 'Ą':'A', 'Ć':'C', 'Ę':'E', 'Ł':'L', 'Ń':'N', 'Ó':'O', 'Ś':'S', 54 | 'Ź':'Z', 'Ż':'Z' 55 | }; 56 | var LATVIAN_MAP = { 57 | 'ā':'a', 'č':'c', 'ē':'e', 'ģ':'g', 'ī':'i', 'ķ':'k', 'ļ':'l', 'ņ':'n', 58 | 'š':'s', 'ū':'u', 'ž':'z', 'Ā':'A', 'Č':'C', 'Ē':'E', 'Ģ':'G', 'Ī':'I', 59 | 'Ķ':'K', 'Ļ':'L', 'Ņ':'N', 'Š':'S', 'Ū':'U', 'Ž':'Z' 60 | }; 61 | var ARABIC_MAP = { 62 | 'أ':'a', 'ب':'b', 'ت':'t', 'ث': 'th', 'ج':'g', 'ح':'h', 'خ':'kh', 'د':'d', 63 | 'ذ':'th', 'ر':'r', 'ز':'z', 'س':'s', 'ش':'sh', 'ص':'s', 'ض':'d', 'ط':'t', 64 | 'ظ':'th', 'ع':'aa', 'غ':'gh', 'ف':'f', 'ق':'k', 'ك':'k', 'ل':'l', 'م':'m', 65 | 'ن':'n', 'ه':'h', 'و':'o', 'ي':'y' 66 | }; 67 | var LITHUANIAN_MAP = { 68 | 'ą':'a', 'č':'c', 'ę':'e', 'ė':'e', 'į':'i', 'š':'s', 'ų':'u', 'ū':'u', 69 | 'ž':'z', 70 | 'Ą':'A', 'Č':'C', 'Ę':'E', 'Ė':'E', 'Į':'I', 'Š':'S', 'Ų':'U', 'Ū':'U', 71 | 'Ž':'Z' 72 | }; 73 | var SERBIAN_MAP = { 74 | 'ђ':'dj', 'ј':'j', 'љ':'lj', 'њ':'nj', 'ћ':'c', 'џ':'dz', 'đ':'dj', 75 | 'Ђ':'Dj', 'Ј':'j', 'Љ':'Lj', 'Њ':'Nj', 'Ћ':'C', 'Џ':'Dz', 'Đ':'Dj' 76 | }; 77 | var AZERBAIJANI_MAP = { 78 | 'ç':'c', 'ə':'e', 'ğ':'g', 'ı':'i', 'ö':'o', 'ş':'s', 'ü':'u', 79 | 'Ç':'C', 'Ə':'E', 'Ğ':'G', 'İ':'I', 'Ö':'O', 'Ş':'S', 'Ü':'U' 80 | }; 81 | 82 | var ALL_DOWNCODE_MAPS = [ 83 | LATIN_MAP, 84 | LATIN_SYMBOLS_MAP, 85 | GREEK_MAP, 86 | TURKISH_MAP, 87 | RUSSIAN_MAP, 88 | UKRAINIAN_MAP, 89 | CZECH_MAP, 90 | POLISH_MAP, 91 | LATVIAN_MAP, 92 | ARABIC_MAP, 93 | LITHUANIAN_MAP, 94 | SERBIAN_MAP, 95 | AZERBAIJANI_MAP 96 | ]; 97 | 98 | var Downcoder = { 99 | 'Initialize': function() { 100 | if (Downcoder.map) { // already made 101 | return; 102 | } 103 | Downcoder.map = {}; 104 | Downcoder.chars = []; 105 | for (var i=0; i