Commit fc46b8a8 authored by Mario Chirinos Colunga's avatar Mario Chirinos Colunga 💬

update

parent e77142b8
......@@ -8,12 +8,11 @@ from django.contrib.admin.widgets import FilteredSelectMultiple
import os
from django.conf import settings
from django.urls import reverse
#-------------------------------------------------------------------------------
class SearchForm(forms.ModelForm):
class Meta:
model = Search
exclude = ["user"]
# fields = '__all__'
widgets = {'startDate': forms.DateInput(attrs={'type':'date', 'class':"form-control"}),
'endDate': forms.DateInput(attrs={'type':'date', 'class':"form-control"}),
......@@ -28,7 +27,7 @@ class SearchForm(forms.ModelForm):
form.user = user
form.save()
#-------------------------------------------------------------------------------
class ProfileForm(forms.Form):
subscriptions = forms.ModelMultipleChoiceField(queryset=Publisher.objects.all(), widget=FilteredSelectMultiple("Publishers", is_stacked=False), required=False)
class Media:
......@@ -38,7 +37,7 @@ class ProfileForm(forms.Form):
# in the temple
css = {'all': (os.path.join(settings.BASE_DIR, '/static/admin/css/widgets.css'),),}
js = ('/catalog/js/jsi18n',)
#-------------------------------------------------------------------------------
class SubscriptionsForm(forms.ModelForm):
# def __init__(self, *args, **kwargs):
......@@ -53,7 +52,7 @@ class SubscriptionsForm(forms.ModelForm):
fields = ('subscriptions',)
# field_classes = {'subscriptions': forms.ModelMultipleChoiceField,}
widgets = {'subscriptions': FilteredSelectMultiple("Publishers", is_stacked=False),}
class Media:
class Media:
# Django also includes a few javascript files necessary
# for the operation of this form element. You need to
# include <script src="/admin/jsi18n"></script>
......@@ -61,7 +60,4 @@ class SubscriptionsForm(forms.ModelForm):
css = {'all': (os.path.join(settings.BASE_DIR, '/static/admin/css/widgets.css'),),}
js = ('/catalog/js/jsi18n')
#forms.MultipleChoiceField(label="Fuentes", widget=forms.SelectMultiple(attrs={'class':"form-control"}), choices=choice, required=False)
......@@ -10,127 +10,97 @@ import itertools
from datetime import date
class Command(BaseCommand):
help = 'Update database'
def add_arguments(self, parser):
parser.add_argument('basedir', nargs=1, type=str)
def handle(self, *args, **options):
#update radio stations recotding time
print("Recording Time:")
recordingsDir = "/home/mario/virtualHDD/m3/recordings/"
audioTime.objects.all().delete()
publishers = Publisher.objects.all().filter(type="audio")
for p in publishers:
files = [files for r, d, files in os.walk(recordingsDir+p.shortName)]
files = list(itertools.chain.from_iterable(files))
minutes = len(files)
sortedFiles = sorted([(f[:f.find(".flac")]) for f in files if f.find(".flac")>0 and f.count(".")==1])
print(p.shortName+": "+ str(minutes))
if len(sortedFiles)>2:
print("timestamp: " + sortedFiles[0])
print("len timestamp: " + str(len(sortedFiles[0])))
#print (files)
#print (sortedFiles)
since = datetime.datetime.utcfromtimestamp(int(sortedFiles[0]))
audioTime.objects.update_or_create(publisher=p, defaults={'minutes': minutes, "startDate": since},)
#load news
os.chdir(options['basedir'][0])
publisherList = os.listdir(options['basedir'][0])
for p in publisherList:
print p
os.chdir(p)
publisher = Publisher.objects.all().filter(shortName=p)[0]
news = News.objects.all().filter(publisher=publisher.id).order_by("-date")
# print publisher.id
minYear = 0
lastDate = datetime.datetime(1950,1,1)
# print news.count()
if news.count()>0:
minYear = news[0].date.year
lastDate = news[0].date
yearList = [ int(y) for y in os.listdir('.')]
# print "LastDate"+str(lastDate)
print yearList
for y in yearList:
if y >=minYear:
os.chdir(str(y))
print os.getcwd()
filesList = os.listdir(".")
for f in filesList:
# print "file: " + f
fileDate = datetime.datetime.strptime(f[:f.find(".")], "%Y-%m-%d").date()
if fileDate >= lastDate.date():
# print "fileDate: " + str(fileDate)
with open(f) as data_file:
try:
data = json.load(data_file)
for d in data:
# if d['date'].find("+") >=0:
# date =d['date'][:d['date'].find("+")].replace("T", " ")
# newsDate = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
# else:
# date = d['date']
# newsDate = datetime.datetime.strptime(date, "%Y-%m-%d")
# print d['date']
# print d['title']
newsDate = dateutil.parser.parse(d['date'])
# newsDate = timezone.make_aware(newsDate, timezone.get_current_timezone())
# print "newsDate:"
# print newsDate
if News.objects.all().filter(Q(publisher=publisher.id)&Q(title=d['title'])&Q(date__gte=newsDate)).count() == 0:
# print "no news match"
if d['title'] == None:
d['title'] = "Sin Titulo"
if len(d['title']) >= 512:
d['title'] = d['title'][:500]
print p + " "+ str(newsDate) + ": " + d['title']
# print type(d['topic'])
news = News()
news.publisher = publisher
# print "title"
news.title = d['title']
# print "text"
news.text = d['text']
# print "url"
news.url = d['url']
# print "date"
news.date = newsDate
news.save()
# print "TOPIC: " + str(d['topic'])
# print type(d['topic'])
if d['topic'] == "" or d['topic'] == None or d['topic'] ==[]:
d['topic'] = "Sin Tema"
if type(d['topic'])=="list":
for t in d['topic']:
topic, created = Topic.objects.all().get_or_create(name=t)
help = 'Update database'
def add_arguments(self, parser):
parser.add_argument('basedir', nargs=1, type=str)
def handle(self, *args, **options):
if True:
#update radio stations recotding time
print("Recording Time:")
recordingsDir = "/home/mario/virtualHDD/m3/recordings/"
audioTime.objects.all().delete()
publishers = Publisher.objects.all().filter(type="audio")
for p in publishers:
files = [files for r, d, files in os.walk(recordingsDir+p.shortName)]
files = list(itertools.chain.from_iterable(files))
minutes = len(files)
sortedFiles = sorted([(f[:f.find(".flac")]) for f in files if f.find(".flac")>0 and f.count(".")==1])
print(p.shortName+": "+ str(minutes))
if len(sortedFiles)>2:
print("timestamp: " + sortedFiles[0])
print("len timestamp: " + str(len(sortedFiles[0])))
since = datetime.datetime.utcfromtimestamp(int(sortedFiles[0]))
audioTime.objects.update_or_create(publisher=p, defaults={'minutes': minutes, "startDate": since},)
#load news
os.chdir(options['basedir'][0])
publisherList = os.listdir(options['basedir'][0])
for p in publisherList:
print (p)
os.chdir(p)
publisher = Publisher.objects.all().filter(shortName=p)[0]
news = News.objects.all().filter(publisher=publisher.id).order_by("-date")
minYear = 0
lastDate = datetime.datetime(1950,1,1)
if news.count()>0:
minYear = news[0].date.year
lastDate = news[0].date
yearList = [ int(y) for y in os.listdir('.')]
print (yearList)
for y in yearList:
if y >=minYear:
os.chdir(str(y))
print (os.getcwd())
filesList = os.listdir(".")
for f in filesList:
fileDate = datetime.datetime.strptime(f[:f.find(".")], "%Y-%m-%d").date()
if fileDate >= lastDate.date():
with open(f) as data_file:
try:
data = json.load(data_file)
for d in data:
newsDate = dateutil.parser.parse(d['date'])
if News.objects.all().filter(Q(publisher=publisher.id)&Q(title=d['title'])&Q(date__gte=newsDate)).count() == 0:
if d['title'] == None:
d['title'] = "Sin Titulo"
if len(d['title']) >= 512:
d['title'] = d['title'][:500]
print (p + " "+ str(newsDate) + ": " + d['title'])
news = News()
news.publisher = publisher
news.title = d['title']
news.text = d['text']
news.url = d['url']
news.date = newsDate
news.save()
if d['topic'] == "" or d['topic'] == None or d['topic'] ==[]:
d['topic'] = "Sin Tema"
if type(d['topic'])=="list":
for t in d['topic']:
topic, created = Topic.objects.all().get_or_create(name=t)
news.topic.add(topic)
else:
topic, created = Topic.objects.all().get_or_create(name=d['topic'])
news.topic.add(topic)
else:
topic, created = Topic.objects.all().get_or_create(name=d['topic'])
news.topic.add(topic)
# print news.date
# print d['date']
# #news.save()
# except (RuntimeError, TypeError, NameError, ValueError) as e:
except ValueError as e:
print e
# print e.NameError
print "Error: " + os.getcwd()+"/"+f
print type(d['topic'])
# print "TOPIC: " + str(d['topic'])
data_file.close()
os.chdir("..")
os.chdir("..")
except ValueError as e:
print (e)
print ("Error: " + os.getcwd()+"/"+f)
print (type(d['topic']))
data_file.close()
os.chdir("..")
os.chdir("..")
......@@ -10,8 +10,8 @@ class AuthRequiredMiddleware(object):
# the view (and later middleware) are called.
response = self.get_response(request)
print request.path_info
print reverse('login')
print (request.path_info)
print (reverse('login'))
if request.path_info == reverse('ws-news-list2'):
return response
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-08-15 20:59
# Generated by Django 1.11.10 on 2018-02-14 15:48
from __future__ import unicode_literals
from django.db import migrations, models
......@@ -18,15 +18,15 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128)),
('shortName', models.CharField(default=b'', max_length=32)),
('crawler', models.CharField(default=b'', max_length=32)),
('type', models.CharField(default=b'', max_length=32)),
('url', models.URLField(default=b'')),
('shortName', models.CharField(default='', max_length=32)),
('crawler', models.CharField(default='', max_length=64)),
('type', models.CharField(default='', max_length=32)),
('url', models.URLField(default='')),
],
options={
'ordering': ('name',),
'verbose_name': 'Medio',
'verbose_name_plural': 'Medios',
'ordering': ('name',),
},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-08-15 20:59
# Generated by Django 1.11.10 on 2018-02-14 15:49
from __future__ import unicode_literals
from django.db import migrations, models
......@@ -16,12 +16,12 @@ class Migration(migrations.Migration):
name='Topic',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=256, verbose_name=b'Tema')),
('name', models.CharField(max_length=256, verbose_name='Tema')),
],
options={
'ordering': ('name',),
'verbose_name': 'Tema',
'verbose_name_plural': 'Temas',
'ordering': ('name',),
},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-08-15 20:59
# Generated by Django 1.11.10 on 2018-02-14 15:49
from __future__ import unicode_literals
import django.contrib.postgres.indexes
import django.contrib.postgres.search
from django.db import migrations, models
import django.db.models.deletion
......@@ -18,16 +20,21 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=512)),
('date', models.DateTimeField(verbose_name=b'Publication Date')),
('text', models.TextField(blank=True, default=b'', verbose_name=b'News Text')),
('url', models.URLField(max_length=512, verbose_name=b'URL')),
('publisher', models.ForeignKey(default=b'', on_delete=django.db.models.deletion.CASCADE, to='catalog.Publisher')),
('topic', models.ManyToManyField(blank=True, to='catalog.Topic', verbose_name=b'Topic(s)')),
('date', models.DateTimeField(verbose_name='Publication Date')),
('text', models.TextField(blank=True, default='', verbose_name='News Text')),
('url', models.URLField(max_length=512, verbose_name='URL')),
('search_vector', django.contrib.postgres.search.SearchVectorField(null=True)),
('publisher', models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='catalog.Publisher')),
('topic', models.ManyToManyField(blank=True, to='catalog.Topic', verbose_name='Topic(s)')),
],
options={
'ordering': ('date',),
'verbose_name': 'Noticia',
'verbose_name_plural': 'Noticias',
'ordering': ('date',),
},
),
migrations.AddIndex(
model_name='news',
index=django.contrib.postgres.indexes.GinIndex(fields=['search_vector'], name='catalog_new_search__62ed1c_gin'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-08-16 03:52
from __future__ import unicode_literals
import django.contrib.postgres.search
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('catalog', '0003_news'),
]
operations = [
migrations.AddField(
model_name='news',
name='search_vector',
field=django.contrib.postgres.search.SearchVectorField(null=True),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-14 18:25
# Generated by Django 1.11.10 on 2018-02-14 15:49
from __future__ import unicode_literals
from django.conf import settings
......@@ -11,7 +11,7 @@ class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('catalog', '0008_profile_subscriptions'),
('catalog', '0003_auto_20180214_1549'),
]
operations = [
......@@ -19,10 +19,10 @@ class Migration(migrations.Migration):
name='Search',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('startDate', models.DateTimeField(verbose_name=b'Start Date')),
('endDate', models.DateTimeField(verbose_name=b'End Date')),
('text', models.CharField(max_length=128)),
('publishers', models.ManyToManyField(to='catalog.Publisher')),
('startDate', models.DateTimeField(verbose_name='Start Date')),
('endDate', models.DateTimeField(verbose_name='End Date')),
('text', models.CharField(blank=True, max_length=128)),
('publishers', models.ManyToManyField(blank=True, to='catalog.Publisher')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
......
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-08-19 20:50
from __future__ import unicode_literals
import django.contrib.postgres.indexes
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('catalog', '0004_news_search_vector'),
]
operations = [
migrations.AddIndex(
model_name='news',
index=django.contrib.postgres.indexes.GinIndex(fields=[b'search_vector'], name='catalog_new_search__62ed1c_gin'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-13 00:06
# Generated by Django 1.11.10 on 2018-02-14 15:50
from __future__ import unicode_literals
from django.conf import settings
......@@ -11,7 +11,7 @@ class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('catalog', '0006_auto_20171126_0109'),
('catalog', '0004_search'),
]
operations = [
......@@ -19,6 +19,7 @@ class Migration(migrations.Migration):
name='Profile',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('subscriptions', models.ManyToManyField(to='catalog.Publisher')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
......
# -*- coding: utf-8 -*-
# Generated by Django 1.11.9 on 2018-01-31 20:50
# Generated by Django 1.11.10 on 2018-02-14 15:50
from __future__ import unicode_literals
from django.db import migrations, models
......@@ -9,7 +9,7 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('catalog', '0014_auto_20171221_1820'),
('catalog', '0005_profile'),
]
operations = [
......@@ -17,8 +17,8 @@ class Migration(migrations.Migration):
name='audioTime',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('startDate', models.DateTimeField(verbose_name=b'Start Date')),
('seconds', models.BigIntegerField(default=0)),
('startDate', models.DateTimeField(verbose_name='Start Date')),
('minutes', models.BigIntegerField(default=0)),
('publisher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='catalog.Publisher')),
],
),
......
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-11-26 01:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('catalog', '0005_auto_20170819_2050'),
]
operations = [
migrations.AlterField(
model_name='publisher',
name='crawler',
field=models.CharField(default=b'', max_length=64),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-13 01:57
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('catalog', '0007_profile'),
]
operations = [
migrations.AddField(
model_name='profile',
name='subscriptions',
field=models.ManyToManyField(to='catalog.Publisher'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-14 18:52
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('catalog', '0009_search'),
]
operations = [
migrations.AlterField(
model_name='search',
name='publishers',
field=models.ManyToManyField(blank=True, to='catalog.Publisher'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-18 18:43
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('catalog', '0010_auto_20171214_1852'),
]
operations = [
migrations.AlterField(
model_name='search',
name='text',
field=models.CharField(blank=True, max_length=128),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-21 16:47
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('catalog', '0011_auto_20171218_1843'),
]
operations = [
migrations.AlterField(
model_name='search',
name='endDate',
field=models.DateTimeField(blank=True, verbose_name=b'End Date'),
),
migrations.AlterField(
model_name='search',
name='startDate',
field=models.DateTimeField(blank=True, verbose_name=b'Start Date'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-21 17:28
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('catalog', '0012_auto_20171221_1647'),
]
operations = [
migrations.AlterField(
model_name='search',
name='endDate',
field=models.DateTimeField(blank=True, null=True, verbose_name=b'End Date'),
),
migrations.AlterField(
model_name='search',
name='startDate',
field=models.DateTimeField(blank=True, null=True, verbose_name=b'Start Date'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-21 18:20
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('catalog', '0013_auto_20171221_1728'),
]
operations = [
migrations.AlterField(
model_name='search',
name='endDate',
field=models.DateTimeField(verbose_name=b'End Date'),
),
migrations.AlterField(
model_name='search',
name='startDate',
field=models.DateTimeField(verbose_name=b'Start Date'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.11.9 on 2018-01-31 21:05
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('catalog', '0015_audiotime'),
]
operations = [
migrations.RenameField(
model_name='audiotime',
old_name='seconds',
new_name='minutes',
),
]
......@@ -79,14 +79,12 @@ class Search(models.Model):
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
subscriptions = models.ManyToManyField(Publisher)
# def __init__(self, *args, **kwargs):
# self.subscriptions = Publisher.objects.all()
# super().__init__(*args, **kwargs)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)#, subscriptions=Publisher.objects.all())
if created:
Profile.objects.create(user=instance)#, subscriptions=Publisher.objects.all())
print ("profile created")
@receiver(post_save, sender=User)
......
......@@ -31,7 +31,10 @@
<div class="panel-body">
<div id="audioCalendar"></div>
<div id="audioDiv">audio tag</div>
<div id="audioDiv">
<audio id="audioPlay" controls>
</audio>
</div>
<!-- /.table-responsive -->
</div>
......@@ -57,6 +60,8 @@
<script>
function getAudioList(publisher, startdate, enddate)
{
url = "/catalog/ws/playlist/?startdate="+startdate+"&enddate="+enddate+"&publisher="+publisher;
console.log(url);
var xmlhttp;
if (window.XMLHttpRequest)
{//IE7+, Firefox, Chrome, Opera, Safari
......@@ -74,10 +79,11 @@ function getAudioList(publisher, startdate, enddate)
var jsonObj = JSON.parse(xmlhttp.responseText);
console.log(jsonObj);
var audioDiv = document.getElementById("audioDiv");
audioDiv.appendChild(document.createElement("audio"));
}
}
xmlhttp.open("GET", "/catalog/ws/playlist/?startdate="+startdate+"&enddate="+enddate+"&publisher="+publisher,true);
xmlhttp.open("GET", url ,true);
xmlhttp.send();
};
$(document).ready(function () {
......@@ -110,16 +116,16 @@ $(document).ready(function () {
function rangeChanged(target, range) {
console.log(range);
var audioDiv = document.getElementById("audioDiv");
while (audioDiv.firstChild)
audioDiv.removeChild(audioDiv.firstChild);
var sound = document.createElement('audio');
sound.id = 'audio-player';
sound.controls = 'controls';
sound.src = 'media/Blue Browne.mp3';
sound.type = 'audio/mpeg';
audioDiv.appendChild(sound);
//var audioDiv = document.getElementById("audioDiv");
// while (audioDiv.firstChild)
// audioDiv.removeChild(audioDiv.firstChild);
// var sound = document.createElement('audio');
// sound.id = 'audio-player';
// sound.controls = 'controls';
// sound.src = 'media/Blue Browne.mp3';
// sound.type = 'audio/mpeg';
// audioDiv.appendChild(sound);
getAudioList("{{publisher.shortName}}",range.start,range.end);
}
......
......@@ -23,10 +23,10 @@ urlpatterns = [
url(r'^audio/$', views.audioList, name='audio'),
url(r'^audio/(?P<publisher>\w+)$', views.audioPublisher, name='audio'),
url(r'^settings/$', views.settings, name='settings'),
url(r'^settings/profile$', views.settings, name='settings-profile'),
url(r'^settings/subscriptions$', views.settings, name='settings-subscriptions'),
url(r'^settings/password$', views.settings, name='settings-password'),
url(r'^settings/$', views.settingsView, name='settings'),
url(r'^settings/profile$', views.settingsView, name='settings-profile'),
url(r'^settings/subscriptions$', views.settingsView, name='settings-subscriptions'),
url(r'^settings/password$', views.settingsView, name='settings-password'),
url(r'^settings/searches$', views.settingsSearches, name='settings-search'),
]
......
......@@ -5,7 +5,7 @@ from django.shortcuts import render
# Create your views here.
from django.conf import settings
from catalog.models import Publisher, News, Search, audioTime
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect
......@@ -27,20 +27,38 @@ import dateutil.parser
import urllib
import json
import StringIO
#import StringIO #python2
from io import StringIO #python3
import time
import zipfile
import csv
from quantiphy import Quantity
from .audioList import getAudioList
#from .audioList import getAudioList
from numpy import array_equal
import os
import shutil
#-------------------------------------------------------------------------------
def getAudiosList2Convert(streamPublisher, initTimestamp, endTimestamp, days):
def getAudiosList2Convert(request, streamPublisher, initTimestamp, endTimestamp, days):
if not request.session.session_key:
request.session.save()
session_id = request.session.session_key
cwd = settings.BASE_DIR
print ("CDW: " + cwd)
directory = cwd+"/catalog/static/audioPlayList/sessions/"+session_id+"/"
if not os.path.exists(directory):
os.mkdir(directory)
else:
shutil.rmtree(directory)
os.mkdir(directory)
recordingsPath = '/home/mario/virtualHDD/m3/recordings/'
initialDate = datetime.fromtimestamp(initTimestamp) #+ timedelta(hours=6)
endDate = datetime.fromtimestamp(endTimestamp) #+ timedelta(hours=6)
initialDate = datetime.datetime.fromtimestamp(initTimestamp) #+ timedelta(hours=6)
endDate = datetime.datetime.fromtimestamp(endTimestamp) #+ timedelta(hours=6)
audiosList = []
......@@ -58,19 +76,20 @@ def getAudiosList2Convert(streamPublisher, initTimestamp, endTimestamp, days):
for file in os.listdir(recordingsPath+audiosPath):
audioTimestamp = int(file.split(".")[0])
if audioTimestamp >= initTimestamp and audioTimestamp <= endTimestamp:
audiosList.append(recordingsPath+audiosPath+file)
#audiosList.append((recordingsPath+audiosPath, file))
audiosList.append(audiosPath+file)
os.symlink(recordingsPath+audiosPath+file, directory+file)
# Next day dir
initialDate += timedelta(days=1)
initialDate += datetime.timedelta(days=1)
return audiosList
#-------------------------------------------------------------------------------
def getRecordingDays(initTimestamp, endTimestamp):
initialDate = datetime.fromtimestamp(initTimestamp) #+ timedelta(hours=6)
endDate = datetime.fromtimestamp(endTimestamp) #+ timedelta(hours=6)
initialDate = datetime.datetime.fromtimestamp(initTimestamp) #+ timedelta(hours=6)
endDate = datetime.datetime.fromtimestamp(endTimestamp) #+ timedelta(hours=6)
print(initialDate)
print(endDate)
......@@ -85,18 +104,18 @@ def getRecordingDays(initTimestamp, endTimestamp):
else:
while not array_equal(iDate, eDate):
days += 1
initialDate += timedelta(days=1)
initialDate += datetime.timedelta(days=1)
iDate = [initialDate.day, initialDate.month, initialDate.year]
return days
#-------------------------------------------------------------------------------
def getAudiosList(streamPublisher, initTimestamp, endTimestamp):
def getAudiosList(request, streamPublisher, initTimestamp, endTimestamp):
initTimestamp = float(initTimestamp)
endTimestamp = float(endTimestamp)
days = getRecordingDays(initTimestamp, endTimestamp)
print('Recording days: {0}'.format(days))
audiosList = getAudiosList2Convert(streamPublisher, initTimestamp, endTimestamp, days)
audiosList = getAudiosList2Convert(request, streamPublisher, initTimestamp, endTimestamp, days)
return audiosList
#-------------------------------------------------------------------------------
......@@ -112,7 +131,7 @@ def news2JSON(news):
data.append(item)
return data
#-------------------------------------------------------------------------------
def settings(request):
def settingsView(request):
# form = ProfileForm( initial={'subscriptions':[ v for v in request.user.profile.subscriptions.all().values_list('id', flat=True)]})
print ("subS",[ v for v in request.user.profile.subscriptions.all().values_list('id', flat=True)])
......@@ -124,15 +143,15 @@ def settings(request):
if form.is_valid():
request.user.profile.subscriptions=form.cleaned_data['subscriptions']
else:
form = ProfileForm( initial={'subscriptions':[ v for v in request.user.profile.subscriptions.all().values_list('id', flat=True)]})
form = ProfileForm( initial={'subscriptions':[ v for v in request.user.profile.subscriptions.all().values_list('id', flat=True)]})
news = News.objects.all()
publishersList = Publisher.objects.all().filter( Q(id__in = news.values('publisher').distinct()))
choice = [ (r.id,r.name) for r in publishersList ]
publishersList = Publisher.objects.all().filter( Q(id__in = news.values('publisher').distinct()))
choice = [ (r.id,r.name) for r in publishersList ]
form.fields['subscriptions'].choices=choice
print( request.user.profile.subscriptions.all() )
print( request.user.profile.subscriptions.all() )
return render(request,'userprofile.html',{"form":form})
return render(request,'userprofile.html',{"form":form})
#-------------------------------------------------------------------------------
def settingsSearches(request):
return render(request,'searches.html',{})
......@@ -205,7 +224,7 @@ def index(request):
for q in queryset:
myRequest = request.GET.copy()
myRequest.update({"publishers":q['publisher']})
urlDict[q['publisher']] = urllib.urlencode(myRequest)
urlDict[q['publisher']] = urllib.parse.urlencode(myRequest)
# print (urlDict)
donutChart = [{"label": Publisher.objects.get(id=q['publisher']).name, "value":q["count"], "url":urlDict[q['publisher']]} for q in queryset]
......@@ -250,7 +269,7 @@ def publisherList(request, type="all"):
if 'publishers' in myRequest:
del myRequest['publishers']
return render(request,'publisherList.html',{"form":form, "publishers":publishers, "queryurl":urllib.urlencode(myRequest)})
return render(request,'publisherList.html',{"form":form, "publishers":publishers, "queryurl":urllib.parse.urlencode(myRequest)})
#-------------------------------------------------------------------------------
def newsList(request, publisherShortName="all"):
......@@ -262,14 +281,15 @@ def wsAudioList(request):
data = dict()
print("wsAudioList", request.GET)
startDate = dateutil.parser.parse(request.GET['startdate']).strftime('%s')
endDate = dateutil.parser.parse(request.GET['enddate']).strftime('%s')
print ("STARTDATE", startDate)
audioList = getAudioList(request.GET['publisher'], startDate, endDate)
# audioList = getAudioList('RadioFormula1041', '1512158400', '1512396000')
audioList = getAudiosList(request, request.GET['publisher'], startDate, endDate)
# audioList = getAudiosList(request, 'RadioFormula1041', '1512158400', '1512396000')
print ("audioList", audioList)
return HttpResponse(json.dumps(data), content_type="application/json")
return HttpResponse(json.dumps(audioList), content_type="application/json")
#-------------------------------------------------------------------------------
def wsSearchList(request):
......@@ -277,19 +297,17 @@ def wsSearchList(request):
searches = Search.objects.all().filter(user=request.user)
data = dict()
data['data']=[[s.text, "*" if s is None else s.startDate.strftime('%Y-%m-%d'), "*" if s is None else s.endDate.strftime('%Y-%m-%d'), ','.join([ sub.shortName for sub in s.publishers.all()])] for s in searches]
data['recordsTotal'] = searches.count()
data['recordsFiltered'] = searches.count()
data['data']=[[s.text, "*" if s is None else s.startDate.strftime('%Y-%m-%d'), "*" if s is None else s.endDate.strftime('%Y-%m-%d'), ','.join([ sub.shortName for sub in s.publishers.all()])] for s in searches]
data['recordsTotal'] = searches.count()
data['recordsFiltered'] = searches.count()
return HttpResponse(json.dumps(data), content_type="application/json")
return HttpResponse(json.dumps(data), content_type="application/json")
#-------------------------------------------------------------------------------
def wsNewsList2(request):
news = getNewsByRequest(request)
data = [{"id":n.id, "text":n.text, "date":n.date.strftime('%Y-%m-%d')} for n in news]
data = [{"id":n.id, "publisher":n.publisher.name, "text":n.text, "date":n.date.strftime('%Y-%m-%d')} for n in news]
return HttpResponse(json.dumps(data), content_type="application/json")
#-------------------------------------------------------------------------------
def wsNewsList(request):#, publisherShortName="all"):
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
# Create your views here.
from catalog.models import Publisher, News
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect
from django.http import HttpResponse
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
import json
import datetime
from dateutil.relativedelta import relativedelta
from django.db.models import Q
from .forms import SearchForm, ProfileForm, SubscriptionsForm
import urllib
from django.db.models import Count
from django.core.urlresolvers import reverse
import json
import StringIO
#from io import StringIO
import time
import zipfile
import csv
from django.db.models.functions import TruncMonth, TruncYear
from quantiphy import Quantity
#-------------------------------------------------------------------------------
def news2JSON(news):
data = list()
for n in news:
item = dict()
item['date'] = n.date.strftime('%Y-%m-%d')
item['publisher'] = n.publisher.name
item['title'] = n.title
item['text'] = n.text
item['url'] = n.url
data.append(item)
return data
#-------------------------------------------------------------------------------
def settings(request):
# form = ProfileForm( initial={'subscriptions':[ v for v in request.user.profile.subscriptions.all().values_list('id', flat=True)]})
print ("subS",[ v for v in request.user.profile.subscriptions.all().values_list('id', flat=True)])
print(request.POST)
# print(form)
#User.objects.get(username=)
if request.method == "POST":
form = ProfileForm(request.POST)
if form.is_valid():
request.user.profile.subscriptions=form.cleaned_data['subscriptions']
else:
form = ProfileForm( initial={'subscriptions':[ v for v in request.user.profile.subscriptions.all().values_list('id', flat=True)]})
news = News.objects.all()
publishersList = Publisher.objects.all().filter( Q(id__in = news.values('publisher').distinct()))
choice = [ (r.id,r.name) for r in publishersList ]
form.fields['subscriptions'].choices=choice
print( request.user.profile.subscriptions.all() )
return render(request,'userprofile.html',{"form":form})
#-------------------------------------------------------------------------------
def settings(request):
return render(request,'usersearch.html',{"form":form})
#-------------------------------------------------------------------------------
def getNewsByRequest(request):
print ("getNewsByRequest\n\n\n")
form = SearchForm(request.GET)
myQuery = ~Q()
if 'publishers' in request.GET and request.GET['publishers']!="None" and request.GET['publishers']!="" and request.GET['publishers']!="[]":
myQuery &= Q(publisher_id__in=form['publishers'].value())
else:
myQuery &= Q(publisher_id__in=[ r.id for r in request.user.profile.subscriptions.all()])
if 'startDate' in request.GET and request.GET['startDate']!="None" and request.GET['startDate']!="":
myQuery &= Q(date__gte=request.GET['startDate'])
else:
myQuery &= Q(date__gte=(datetime.date.today()- relativedelta(years=1)).strftime("%Y-%m-%d"))
if 'endDate' in request.GET and request.GET['endDate']!="None" and request.GET['endDate']!="":
myQuery &= Q(date__lte=request.GET['endDate'])
if "text" in request.GET and request.GET['text']!="None" and request.GET['text']!="":
# myQuery &= Q(text__search=request.GET['text'])
myQuery &= Q(search_vector=request.GET['text'])
print (myQuery)
return News.objects.all().filter(myQuery)
#-------------------------------------------------------------------------------
def index(request):
"""
View function for home page of site.
"""
news = getNewsByRequest(request)
form = SearchForm(request.GET.copy())#, initial={'publishers':[]})
subscriptions = [ (r.id,r.name) for r in request.user.profile.subscriptions.all()]
print (subscriptions)
form.fields['publishers'].choices= subscriptions
if news.count()>0:
if 'startDate' not in form or ('startDate' in form and form['startDate'].value == ""):
form.data.update({'startDate':news.earliest('date').date.strftime("%Y-%m-%d")})
if 'endDate' not in form or ('endDate' in form and form['endDate'].value == ""):
form.data.update({'endDate':news.latest('date').date.strftime("%Y-%m-%d")})
info = dict()
info['nPublishers'] = news.values('publisher').distinct().count()
info['nNews'] = news.count()
info['nNewsText'] = Quantity(news.count()).render(prec=3)
info['nAudio'] = Publisher.objects.all().filter(type="audio").count()
queryset = news.values("publisher").order_by("publisher").annotate(count = Count('publisher') )
urlDict = dict()
for q in queryset:
myRequest = request.GET.copy()
myRequest.update({"publishers":q['publisher']})
urlDict[q['publisher']] = urllib.urlencode(myRequest)
print (urlDict)
donutChart = [{"label": Publisher.objects.get(id=q['publisher']).name, "value":q["count"], "url":urlDict[q['publisher']]} for q in queryset]
publishers = Publisher.objects.all().filter( Q(id__in = news.values('publisher').distinct()))
queryset = news.values("publisher").annotate(day=TruncMonth('date') )
dateList =[q['day'].strftime("%Y-%m-%d") for q in queryset.values("day").distinct().order_by("-day")]
dateDicts = {p.shortName:{ n['day'].strftime("%Y-%m-%d"):n['count'] for n in queryset.filter(publisher=p.id).values("day").distinct().order_by("-day").annotate(count = Count('publisher')) } for p in publishers}
histogramsData = [ { "date":d, "data":{ k:(dateDicts[k][d] if d in dateDicts[k] else 0) for k in dateDicts.keys()} } for d in dateList]
histogramsLabels = [p.shortName for p in publishers]
# return render(request,'index.html',{"form":form, "info":info, "donutChart":{}, "histogram": {}, "histogramsLabels":{}})
return render(request,'index.html',{"form":form, "info":info, "donutChart":donutChart, "histogram": histogramsData, "histogramsLabels":histogramsLabels})
#-------------------------------------------------------------------------------
def publisherList(request, type="all"):
form = SearchForm(request.GET)
typeQuery = ~Q()
if type!="all":
typeQuery = Q(type=type)
news = getNewsByRequest(request)
publishers = Publisher.objects.all().filter( Q(id__in = news.values('publisher').distinct()) & typeQuery)
for p in publishers:
newsTemp = news.filter(publisher=p).order_by("date")
p.news = newsTemp.count()
p.date = 0
if p.news>0:
p.date = newsTemp[0].date.date()
else:
p.date = "-"
myRequest=request.GET.copy()
if 'publishers' in myRequest:
del myRequest['publishers']
return render(request,'publisherList.html',{"form":form, "publishers":publishers, "queryurl":urllib.urlencode(myRequest)})
#-------------------------------------------------------------------------------
def newsList(request, publisherShortName="all"):
form = SearchForm(request.GET)
return render(request,'newsList.html',{"form":form})
#-------------------------------------------------------------------------------
def wsNewsList2(request):
news = getNewsByRequest(request)
data = [{"id":n.id, "text":n.text, "date":n.date.strftime('%Y-%m-%d')} for n in news]
return HttpResponse(json.dumps(data), content_type="application/json")
#-------------------------------------------------------------------------------
def wsNewsList(request):#, publisherShortName="all"):
print (request.GET)
columns = ['title', 'url', 'date']
order = dict()
order["asc"]=""
order["desc"]="-"
orderBy = columns[ int(request.GET["order[0][column]"]) ]
direction = order[request.GET["order[0][dir]"]]
startDate = datetime.datetime(1950,1,1,0,0,0)
endDate = datetime.datetime.today()
request.GET = request.GET.copy()
if 'ajaxPublishers[]' in request.GET:
request.GET.setlist('publishers', request.GET.getlist('ajaxPublishers[]'))
del request.GET['ajaxPublishers[]']
news = getNewsByRequest(request).order_by(direction+orderBy)
if 'search[value]' in request.GET and request.GET['search[value]'] != "":
search = request.GET['search[value]']
news = news.filter(text__icontains=search)
data = dict()
data['data']=list()
data['recordsTotal'] = news.count()
data['recordsFiltered'] = news.count()
paginator = Paginator(news, request.GET['length'])
page = (int(request.GET['start'])/int(request.GET['length']))+1
try:
news = paginator.page(page)
except PageNotAnInteger:
news = paginator.page(1)
except EmptyPage:
news = paginator.page(paginator.num_pages)
for n in news:
row = list()
row.append('<a href="'+reverse('news-details', args =(n.id,) )+ "?"+ request.GET.urlencode() +'">'+ n.title+ '</a>')
row.append('<a href="'+n.url+'" target="blank">'+n.publisher.shortName+'</a>')
row.append(n.date.strftime("%Y-%m-%d"))
data['data'].append(row)
# print request.GET
return HttpResponse(json.dumps(data), content_type="application/json")
#-------------------------------------------------------------------------------
def newsDetails(request, newsId):
form = SearchForm(request.GET)
news = News.objects.get(id=newsId)
# news.text = news.text.replace(request.GET['text'], "<b>"+request.GET['text']+"</b>")
return render(request,'newsDetails.html',{"form":form,"news":news})
#-------------------------------------------------------------------------------
def wsGraphs(request):
data=dict()
if request.GET['type']=="histogram":
data = 0;
return HttpResponse(json.dumps(data), content_type="application/json")
#-------------------------------------------------------------------------------
def wsDownloadNews(request):
news = getNewsByRequest(request)
s = StringIO.StringIO() # Open StringIO to grab in-memory ZIP contents
zf = zipfile.ZipFile(s, "w") # The zip compressor
zf.writestr("setting.txt", json.dumps(request.GET))
data = news2JSON(news);
if request.GET['format']=="JSON":
zf.writestr("data.json", json.dumps(data))
if request.GET['format']=="CSV":
csvString = StringIO.StringIO()
writer = csv.writer(csvString,quoting=csv.QUOTE_ALL)#, fieldnames=[k for k in data[0]])
# writer.writeheader()
for d in data:
row = [ d[k].encode('utf-8') for k in d ]
writer.writerow( row )
zf.writestr("data.csv", csvString.getvalue())
zf.close()
response = HttpResponse(s.getvalue(), content_type="application/x-zip-compressed")
response['Content-Disposition'] = 'attachment; filename="news_'+ str(int(time.time()))+'.zip"'
return response
#-------------------------------------------------------------------------------
def audioList(request):
form = SearchForm(request.GET)
publishers = Publisher.objects.all().filter( type="audio")
return render(request,'audioList.html',{"form":form, "publishers":publishers})
#-------------------------------------------------------------------------------
def audioPublisher(request, publisher):
form = SearchForm(request.GET)
info=dict()
if Publisher.objects.all().filter(shortName=publisher).count() > 0:
p = Publisher.objects.all().filter(shortName=publisher)[0]
return render(request,'audioPlay.html',{"form":form, "publisher":p})
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment