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

mario

parent fe43e886
......@@ -2,8 +2,13 @@
from django import forms
#from django.contrib.auth.forms import UserCreationForm
#from django.contrib.auth.models import User
from catalog.models import Publisher, News
from catalog.models import Publisher, News, Profile
from django.db.models import Q
from django.contrib.admin.widgets import FilteredSelectMultiple
import os
from django.conf import settings
from django.urls import reverse
class SearchForm(forms.Form):
startDate = forms.DateField(label="Fecha de Inicio", widget=forms.DateInput(attrs={'type':'date', 'class':"form-control"}), required=False)
......@@ -19,11 +24,18 @@ class SearchForm(forms.Form):
def __init__(self, *args, **kwargs):
super(SearchForm, self).__init__(*args, **kwargs)
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 ]
self.fields['publishers'] = forms.MultipleChoiceField(label="Fuentes", widget=forms.SelectMultiple(attrs={'class':"form-control"}), choices=choice, required=False)
class ProfileForm(forms.Form):
subscriptions = forms.ModelMultipleChoiceField(queryset=Publisher.objects.all(), widget=FilteredSelectMultiple("Publishers", is_stacked=False), required=False)
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>
# in the temple
css = {'all': (os.path.join(settings.BASE_DIR, '/static/admin/css/widgets.css'),),}
js = ('/catalog/js/jsi18n',)
No preview for this file type
from django.core.management.base import BaseCommand, CommandError
from catalog.models import News, Publisher, Topic
from django.db.models import Q
import os
import json
import datetime
from django.utils import timezone
import dateutil.parser
class Command(BaseCommand):
help = 'Update database'
def add_arguments(self, parser):
parser.add_argument('basedir', nargs=1, type=str)
def handle(self, *args, **options):
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)
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("..")
......@@ -12,6 +12,10 @@ class AuthRequiredMiddleware(object):
response = self.get_response(request)
print request.path_info
print reverse('login')
if request.path_info == reverse('ws-news-list2'):
return response
if not request.user.is_authenticated() and request.path_info != reverse('login'):
return HttpResponseRedirect(reverse('login'))
......
No preview for this file type
# -*- coding: utf-8 -*-
# Generated by Django 1.11.7 on 2017-12-13 00:06
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('catalog', '0006_auto_20171126_0109'),
]
operations = [
migrations.CreateModel(
name='Profile',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]
# -*- 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'),
),
]
......@@ -2,8 +2,12 @@ from django.db import models
from django.db.models.fields import TextField
from django.contrib.postgres.search import SearchVectorField, SearchVector
from django.contrib.postgres.indexes import GinIndex
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
# Create your models here.
class Publisher(models.Model):
name = models.CharField(max_length=128)
shortName = models.CharField(max_length=32, default="")
......@@ -12,7 +16,7 @@ class Publisher(models.Model):
url = models.URLField(default="")
def __str__(self):
return self.name
return self.shortName
class Meta:
verbose_name = 'Medio'
......@@ -61,3 +65,19 @@ class News(models.Model):
verbose_name_plural = 'Noticias'
ordering = ('date',)
indexes = [ GinIndex(fields=['search_vector']) ]
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
subscriptions = models.ManyToManyField(Publisher)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
No preview for this file type
......@@ -19,47 +19,44 @@
<!-- /.navbar-header -->
<ul class="nav navbar-top-links navbar-right">
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-envelope fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-messages">
{% block dropdown-messages %}{% endblock %}
</ul>
<!-- /.dropdown-messages -->
</li>
<!-- /.dropdown -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-tasks fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-tasks">
{% block dropdown-tasks %}{% endblock %}
</ul>
<!-- <li class="dropdown">-->
<!-- <a class="dropdown-toggle" data-toggle="dropdown" href="#">-->
<!-- <i class="fa fa-envelope fa-fw"></i> <i class="fa fa-caret-down"></i>-->
<!-- </a>-->
<!-- <ul class="dropdown-menu dropdown-messages">-->
<!-- {% block dropdown-messages %}{% endblock %} -->
<!-- </ul>-->
<!-- </li>-->
<!-- /.dropdown-tasks -->
</li>
<!-- /.dropdown -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-bell fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-alerts">
{% block dropdown-alerts %}{% endblock %}
<!-- <li class="dropdown">-->
<!-- <a class="dropdown-toggle" data-toggle="dropdown" href="#">-->
<!-- <i class="fa fa-tasks fa-fw"></i> <i class="fa fa-caret-down"></i>-->
<!-- </a>-->
<!-- <ul class="dropdown-menu dropdown-tasks">-->
<!-- {% block dropdown-tasks %}{% endblock %} -->
<!-- </ul>-->
<!-- </li>-->
</ul>
<!-- /.dropdown-alerts -->
</li>
<!-- <li class="dropdown">-->
<!-- <a class="dropdown-toggle" data-toggle="dropdown" href="#">-->
<!-- <i class="fa fa-bell fa-fw"></i> <i class="fa fa-caret-down"></i>-->
<!-- </a>-->
<!-- <ul class="dropdown-menu dropdown-alerts">-->
<!-- {% block dropdown-alerts %}{% endblock %} -->
<!-- </ul>-->
<!-- </li>-->
<!-- /.dropdown -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#"><i class="fa fa-user fa-fw"></i> {{ user.get_username }}</a>
<li><a href="{% url 'settings-profile' %}"><i class="fa fa-user fa-fw"></i> {{ user.get_username }}</a>
</li>
<li><a href="#"><i class="fa fa-gear fa-fw"></i> Settings</a>
<li><a href="{% url 'settings' %}"><i class="fa fa-gear fa-fw"></i> Settings</a>
</li>
<li class="divider"></li>
<li><a href="{% url 'logout'%}?next={{request.path}}"><i class="fa fa-sign-out fa-fw"></i> Logout</a>
......@@ -70,9 +67,10 @@
<!-- /.dropdown -->
</ul>
<!-- /.navbar-top-links -->
{% include "leftMenuBar.html" %}
<div class="navbar-default sidebar" role="navigation">
{% block lefPanel %}{% endblock %}
</div>
<!-- /.navbar-static-side -->
</nav>
......
......@@ -12,6 +12,10 @@
<link rel="icon" href="{% static 'images/m3.png' %}">
<title>Monitoreo de Multiples Medios</title>
{% load staticfiles %}
<script type="text/javascript" src="{% static 'static_jquery/js/jquery.js' %}" ></script>
<script type="text/javascript" src="{% static 'admin/js/jquery.init.js' %}" ></script>
<!-- Custom CSS -->
<!-- Bootstrap Core CSS -->
......@@ -43,13 +47,14 @@
<![endif]-->
<!-- /#wrapper -->
{% block headMedia %}{% endblock %}
</head>
<body>
{% block budy %}{% endblock %}
<!-- jQuery -->
<script src="{% static 'vendor/jquery/jquery.min.js' %}"></script>
<!-- Bootstrap Core JavaScript -->
......@@ -69,6 +74,8 @@
<!-- Custom Theme JavaScript -->
<script src="{% static 'dist/js/sb-admin-2.js' %}"></script>
{% block scripts %}{% endblock %}
</body>
......
{% extends "base_generic.html" %}
{% block lefPanel %}{% include "leftMenuBar.html" %}{% endblock %}
{% block dash %}
<!-- /.row -->
<div class="row">
{% block infoPanels %}{% endblock %}
......
{% extends "base_index.html" %}
{% block dash-title %}
<b>{{form.text.value|default:"Tablero"|capfirst}}</b>
......@@ -66,7 +67,7 @@
<i class="fa fa-database fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">{{info.nNews|intcomma}}</div>
<div class="huge">{{info.nNewsText}}</div>
<div>Noticias</div>
</div>
</div>
......
<div class="navbar-default sidebar" role="navigation">
<div class="sidebar-nav navbar-collapse">
<div class="sidebar-nav navbar-collapse">
<ul class="nav" id="side-menu">
......@@ -66,6 +66,6 @@
</li>
</ul>
</div>
<!-- /.sidebar-collapse -->
</div>
<!-- /.sidebar-collapse -->
{% extends "base_generic.html" %}
{% block lefPanel %}{% include "leftMenuBar.html" %}{% endblock %}
{% load app_filters %}
{% block dash-title %}<a href="{{news.publisher.url}}" target="blank">{{news.publisher.name}}</a>{% endblock %}
......
{% extends "base_generic.html" %}
{% block lefPanel %}{% include "leftMenuBar.html" %}{% endblock %}
{% block dash-title %}
<b>{{form.text.value|default:"Noticias"|capfirst}}</b>
......
{% extends "base_generic.html" %}
{% block lefPanel %}{% include "leftMenuBar.html" %}{% endblock %}
{% load humanize %}
{% block dash-title %}
......
{% extends "base_generic.html" %}
{% block lefPanel %}
<div class="sidebar-nav navbar-collapse">
<ul class="nav" id="side-menu">
<li>
<a href="{% url 'settings-profile' %}"><i class="fa fa-user fa-fw"></i>Perfil</a>
</li>
<li>
<a href="{% url 'settings-password' %}"><i class="fa fa-lock fa-fw"></i>Contraseña</a>
</li>
<li>
<a href="{% url 'settings-subscriptions' %}"><i class="fa fa-rss fa-fw"></i>Subscripciones</a>
</li>
<!-- <li>-->
<!-- <a href=""><i class="fa fa-user fa-rss"></i>Subscripciones</a>-->
<!-- </li>-->
</ul>
</div>
{% endblock %}
{% block dash %}
<!-- /.row -->
<div class="row">
{% block infoPanels %}{% endblock %}
</div>
<!-- /.row -->
<div class="row">
{% block graphs1 %}{% endblock %}
</div>
{% endblock %}
{% extends "settings_base.html" %}
{% block headMedia %}
{{ form.media }}
{% endblock %}
{% block dash-title %}
<b>{{form.text.value|default:"Perfi de usuario"|capfirst}}</b>
{% endblock %}
{% block infoPanels %}
<form method="post">
{% csrf_token %}
<div>{{ form }}</div>
<div><button type="submit">Save changes</button></div>
</form>
{% endblock %}
{% block scripts %}
<script>
</script>
{% endblock %}
from django.conf.urls import url
from . import views
from django.views.i18n import javascript_catalog
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^js/jsi18n/$', javascript_catalog, name='jsi18n'),
url(r'^publishers/$', views.publisherList, name='publishers-list'),
url(r'^publishers/(?P<type>\w+)$', views.publisherList, name='publishers-list'),
url(r'^news/details/(?P<newsId>\w+)/$', views.newsDetails, name='news-details'),
url(r'^news/$', views.newsList, name='news-list'),
url(r'^ws/news/$', views.wsNewsList, name='ws-news-list'),
url(r'^ws/jsonnews/$', views.wsNewsList2, name='ws-news-list2'),
url(r'^ws/graphs/$', views.wsGraphs, name='ws-graphs'),
url(r'^ws/download/$', views.wsDownloadNews, name='ws-download-news'),
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'),
]
No preview for this file type
......@@ -13,17 +13,21 @@ 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
from .forms import SearchForm, ProfileForm
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()
......@@ -37,18 +41,34 @@ def news2JSON(news):
data.append(item)
return data
#-------------------------------------------------------------------------------
def settings(request):
form = ProfileForm(request.POST.copy())
print(request.POST)
#User.objects.get(username=)
print( request.user.profile.subscriptions )
if 'subscriptions' in request.POST:
request.user.profile.subscriptions = Publisher.objects.all().filter(id__in=request.POST['subscriptions'])
request.user.save()
print( request.user.profile.subscriptions )
return render(request,'userprofile.html',{"form":form})
#-------------------------------------------------------------------------------
def getNewsByRequest(request):
print "getNewsByRequest\n\n\n"
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())
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'])
......@@ -57,7 +77,7 @@ def getNewsByRequest(request):
# myQuery &= Q(text__search=request.GET['text'])
myQuery &= Q(search_vector=request.GET['text'])
print myQuery
print (myQuery)
return News.objects.all().filter(myQuery)
......@@ -79,6 +99,7 @@ def index(request):
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') )
......@@ -88,7 +109,7 @@ def index(request):
myRequest = request.GET.copy()
myRequest.update({"publishers":q['publisher']})
urlDict[q['publisher']] = urllib.urlencode(myRequest)
print urlDict
print (urlDict)
donutChart = [{"label": Publisher.objects.get(id=q['publisher']).name, "value":q["count"], "url":urlDict[q['publisher']]} for q in queryset]
......@@ -141,9 +162,15 @@ def newsList(request, publisherShortName="all"):
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
print (request.GET)
columns = ['title', 'url', 'date']
order = dict()
order["asc"]=""
......
No preview for this file type
......@@ -40,6 +40,7 @@ INSTALLED_APPS = [
'django.contrib.humanize',
'catalog.apps.CatalogConfig',
'django.contrib.postgres',
'django_static_jquery',
]
......
......@@ -19,6 +19,7 @@ from django.conf.urls import include
from django.views.generic import RedirectView
from django.conf.urls.static import static
from django.conf import settings
from django.views.i18n import javascript_catalog
urlpatterns = [
url(r'^admin/', admin.site.urls),
......
No preview for this file type
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