initial import
This commit is contained in:
@@ -0,0 +1,974 @@
|
||||
/************************************************************************
|
||||
* $Id: article.cpp 661 2011-04-05 13:16:53Z elzubeir $
|
||||
*
|
||||
* ------------
|
||||
* Description:
|
||||
* ------------
|
||||
*
|
||||
* (C) Copyright 2009-2011 ALLCONTENT. All rights reserved.
|
||||
*
|
||||
* -----------------
|
||||
* Revision Details: (Updated by Revision Control System)
|
||||
* -----------------
|
||||
* $Date: 2011-04-05 17:16:53 +0400 (Tue, 05 Apr 2011) $
|
||||
* $Author: elzubeir $
|
||||
* $Revision: 661 $
|
||||
* $HeadURL: file:///opt/svn/socialhose/trunk/app/ClippingStation/article.cpp $
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
|
||||
#include "article.h"
|
||||
#include "publication.h"
|
||||
#include "section.h"
|
||||
#include "imagecutout.h"
|
||||
|
||||
|
||||
Article::Article(): m_status(1)
|
||||
{
|
||||
m_imagesNumber = 0;
|
||||
}
|
||||
|
||||
Article::~Article()
|
||||
{
|
||||
//qDebug("~Article()");
|
||||
|
||||
//for(int i=0; i< m_imageCutoutsList.count(); i++)
|
||||
//delete m_imageCutoutsList[i];
|
||||
|
||||
//m_imageCutoutsList.clear();
|
||||
}
|
||||
|
||||
bool Article::operator == (const Article & pc)
|
||||
{
|
||||
return (this->m_id == pc.m_id);
|
||||
}
|
||||
|
||||
void Article::setId(int articleId)
|
||||
{
|
||||
m_id = articleId;
|
||||
}
|
||||
|
||||
void Article::setPagename(QString pagename)
|
||||
{
|
||||
m_pagename = pagename;
|
||||
}
|
||||
|
||||
void Article::setImageCutouts(QList<ImageCutout *> cutoutsList)
|
||||
{
|
||||
m_imageCutoutsList = cutoutsList;
|
||||
}
|
||||
|
||||
void Article::updateImageCutouts(QSqlDatabase &database, QList<ImageCutout *> cutoutsList)
|
||||
{
|
||||
//the easit way to do it is to delete all the old clipping coordinates, and insert new ones
|
||||
QSqlQuery query(database);
|
||||
query.prepare("DELETE FROM clipping_coordinates WHERE id_article = :id_article");
|
||||
query.bindValue(":id_article", m_id);
|
||||
if(!query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
|
||||
//now just insert the new ones
|
||||
setCippingCoordinates(database, m_id, cutoutsList);
|
||||
m_imageCutoutsList = cutoutsList;
|
||||
}
|
||||
|
||||
|
||||
void Article::setTags(QList<Tag> &tags)
|
||||
{
|
||||
m_tags = tags;
|
||||
}
|
||||
|
||||
void Article::updateTags(QSqlDatabase &database, QList<Tag> &tags, bool isArabic)
|
||||
{
|
||||
//if(tags == m_tags)
|
||||
// return;
|
||||
|
||||
//here, we either have tags added, removed, or added and removed
|
||||
QList<Tag> addedTags; //check for new added tags;
|
||||
foreach (Tag tag, tags)
|
||||
{
|
||||
if( !m_tags.contains(tag) )
|
||||
addedTags.append(tag);
|
||||
}
|
||||
|
||||
QList<Tag> removedTags;
|
||||
foreach(Tag tag, m_tags)
|
||||
{
|
||||
if(!tags.contains(tag))
|
||||
{
|
||||
m_tags.removeOne(tag);
|
||||
removedTags.append(tag);
|
||||
}
|
||||
}
|
||||
m_tags.append(addedTags);
|
||||
|
||||
if(removedTags.count() > 0)
|
||||
{
|
||||
//we will remov tags from database
|
||||
QSqlQuery query(database);
|
||||
query.prepare("DELETE FROM article_company WHERE id_article = :id_article AND id_company = :id_company");
|
||||
query.bindValue(":id_article", m_id);
|
||||
|
||||
for(int i=0; i< removedTags.count(); i++)
|
||||
{
|
||||
query.bindValue(":id_company", removedTags[i].id());
|
||||
|
||||
if(!query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
}
|
||||
|
||||
//also remove all the accombining prominence values
|
||||
query.prepare("DELETE FROM prominence WHERE id_article = :id_article AND id_company = :id_company");
|
||||
query.bindValue(":id_article", m_id);
|
||||
for(int i=0; i< removedTags.count(); i++)
|
||||
{
|
||||
query.bindValue(":id_company", removedTags[i].id());
|
||||
|
||||
if(!query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(addedTags.count() > 0)
|
||||
{
|
||||
//we will add tags from database
|
||||
QSqlQuery query(database);
|
||||
query.prepare("INSERT INTO article_company (id_article, id_company, coordinates) VALUES (:id_article, :id_company, :coordinates)");
|
||||
query.bindValue(":id_article", m_id);
|
||||
|
||||
for(int i=0; i< addedTags.count(); i++)
|
||||
{
|
||||
query.bindValue("id_company", addedTags[i].id());
|
||||
query.bindValue(":coordinates", addedTags[i].coordinates());
|
||||
|
||||
if(!query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//we need to update the towrite flag as well
|
||||
//get the max value from tags
|
||||
int towrite = 0;
|
||||
for(int i=0; i< m_tags.count(); i++)
|
||||
{
|
||||
if(towrite < m_tags[i].towrite())
|
||||
towrite = m_tags[i].towrite();
|
||||
}
|
||||
|
||||
for(int i=0; i< addedTags.count(); i++)
|
||||
{
|
||||
if(towrite < addedTags[i].towrite())
|
||||
towrite = addedTags[i].towrite();
|
||||
}
|
||||
|
||||
if(towrite > 0)
|
||||
setArticleTowrite(database, m_id, towrite, isArabic);
|
||||
|
||||
m_tags = tags;
|
||||
}
|
||||
|
||||
void Article::setImagesNumber(int imagesNumber)
|
||||
{
|
||||
m_imagesNumber = imagesNumber;
|
||||
}
|
||||
|
||||
void Article::updateImagesNumber(QSqlDatabase &database, int images_number)
|
||||
{
|
||||
m_imagesNumber = images_number;
|
||||
QSqlQuery query(database);
|
||||
query.prepare("UPDATE article SET images_number = :images_number WHERE id_article = :id_article");
|
||||
query.bindValue(":images_number", images_number);
|
||||
query.bindValue(":id_article" , m_id);
|
||||
|
||||
if(!query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
}
|
||||
|
||||
void Article::updateImagesNumber(QSqlDatabase &database, int articleId, int images_number)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("UPDATE article SET images_number = :images_number WHERE id_article = :id_article");
|
||||
query.bindValue(":images_number", images_number);
|
||||
query.bindValue(":id_article" , articleId);
|
||||
|
||||
if(!query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Article::setImagesLocalPath(QHash<QString, QString> path)
|
||||
{
|
||||
m_imagesLocalPath = path;
|
||||
}
|
||||
|
||||
void Article::setImagesRemotePath(QHash<QString, QString> path)
|
||||
{
|
||||
m_imagesRemotePath = path;
|
||||
}
|
||||
|
||||
void Article::setStatus(int status)
|
||||
{
|
||||
m_status = status;
|
||||
}
|
||||
|
||||
void Article::updateStatus(QSqlDatabase &database, int status)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("UPDATE article set clipping_status = :clipping_status WHERE id_article = :id_article");
|
||||
query.bindValue(":clipping_status" , status);
|
||||
query.bindValue(":id_article" , m_id);
|
||||
|
||||
if ( !query.exec() )
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
}
|
||||
|
||||
void Article::updateStatus(QSqlDatabase &database, int articleId, int status)
|
||||
{
|
||||
qDebug("updateStatus() for article %d", articleId);
|
||||
QSqlQuery query(database);
|
||||
query.prepare("UPDATE article set clipping_status = :clipping_status WHERE id_article = :id_article");
|
||||
query.bindValue(":clipping_status" , status);
|
||||
query.bindValue(":id_article" , articleId);
|
||||
|
||||
if ( !query.exec() )
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
|
||||
qDebug("end of updateStatus() for article %d", articleId);
|
||||
}
|
||||
|
||||
void Article::updateHeadline(QSqlDatabase &database, int id, QString headline, bool isArabic)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
if(isArabic)
|
||||
query.prepare("UPDATE article set headline_ar = :headline WHERE id_article = :id");
|
||||
else
|
||||
query.prepare("UPDATE article set headline_en = :headline WHERE id_article = :id");
|
||||
|
||||
query.bindValue(":headline", headline);
|
||||
query.bindValue(":id_article", id);
|
||||
|
||||
if ( !query.exec() )
|
||||
qDebug() << "updateHeadline() error: " << query.lastError().text().toAscii();
|
||||
}
|
||||
|
||||
|
||||
void Article::updateText(QSqlDatabase &database, int id, QString text)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("UPDATE article set text_ocr = :text WHERE id_article = :id_article");
|
||||
query.bindValue(":text" , text);
|
||||
query.bindValue(":id_article", id);
|
||||
|
||||
if ( !query.exec() )
|
||||
{
|
||||
qDebug() << "updateText() error: " << query.lastError().text().toAscii();
|
||||
qDebug() << "text is " << text;
|
||||
}
|
||||
}
|
||||
|
||||
void Article::deleteArticle(QSqlDatabase &database)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("DELETE FROM article WHERE id_article = :id_article");
|
||||
query.bindValue(":id_article" , m_id);
|
||||
|
||||
if ( !query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
|
||||
query.prepare("DELETE FROM article_company WHERE id_article = :id_article");
|
||||
query.bindValue(":id_article" , m_id);
|
||||
|
||||
if ( !query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
|
||||
query.prepare("DELETE FROM clipping_coordinates WHERE id_article = :id_article");
|
||||
query.bindValue(":id_article" , m_id);
|
||||
|
||||
if ( !query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text().toAscii();
|
||||
qDebug() << "\t...." << query.lastError().databaseText();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Article::deleteArticle(QSqlDatabase &database, int articleId)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
|
||||
query.prepare("DELETE FROM article WHERE id_article = :id_article");
|
||||
query.bindValue(":id_article" , articleId);
|
||||
query.exec();
|
||||
|
||||
query.prepare("DELETE FROM article_company WHERE id_article = :id_article");
|
||||
query.bindValue(":id_article" , articleId);
|
||||
query.exec();
|
||||
|
||||
query.prepare("DELETE FROM clipping_coordinates WHERE id_article = :id_article");
|
||||
query.bindValue(":id_article" , articleId);
|
||||
query.exec();
|
||||
}
|
||||
|
||||
|
||||
int Article::id()
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
|
||||
QList<ImageCutout *> Article::imageCutoutsList()
|
||||
{
|
||||
return m_imageCutoutsList;
|
||||
}
|
||||
|
||||
QList<Tag> Article::tags()
|
||||
{
|
||||
return m_tags;
|
||||
}
|
||||
|
||||
int Article::imagesNumber()
|
||||
{
|
||||
return m_imagesNumber;
|
||||
}
|
||||
|
||||
int Article::status()
|
||||
{
|
||||
return m_status;
|
||||
}
|
||||
|
||||
QStringList Article::pageNames()
|
||||
{
|
||||
QList<QString> keys = m_imagesLocalPath.keys();
|
||||
QStringList list(keys);
|
||||
list.sort();
|
||||
return list;
|
||||
}
|
||||
|
||||
void Article::getImagesLocalAndRemoateFiles(QStringList &localpaths, QStringList &remotepaths)
|
||||
{
|
||||
localpaths.clear(); //clear the list
|
||||
remotepaths.clear();
|
||||
foreach (QString key, m_imagesLocalPath.keys() )
|
||||
{
|
||||
localpaths.append(m_imagesLocalPath [key]);
|
||||
remotepaths.append(m_imagesRemotePath[key]);
|
||||
}
|
||||
|
||||
localpaths.sort();
|
||||
remotepaths.sort();
|
||||
}
|
||||
|
||||
|
||||
bool Article::updateArticle(QSqlDatabase &database, Publication &publication, QList<Tag> &tags, QList<ImageCutout *> &cutoutsList, qreal imageSize)
|
||||
{
|
||||
QSqlQuery queryMaster(database);
|
||||
|
||||
queryMaster.prepare("UPDATE article SET headline_en = :headline_en, "
|
||||
"page_number = :page_number, "
|
||||
"size = :size, ave = :ave, real_size = :real_size, size_l = :size_l, size_w = :size_w WHERE id_article =:id_article ");
|
||||
|
||||
QString headline_en = Tag::headlineEnglish(tags);
|
||||
QString page_number = ImageCutout::pages(cutoutsList);
|
||||
|
||||
qreal size_l;
|
||||
qreal size_w;
|
||||
qreal size;
|
||||
qreal real_size;
|
||||
|
||||
getSize(publication, imageSize, size_l, size_w, size, real_size, cutoutsList);
|
||||
qreal ave = calculateAVE(publication.isMagazine(), publication.adRate(), size, real_size, true);
|
||||
|
||||
queryMaster.bindValue(":id_article", m_id);
|
||||
queryMaster.bindValue(":headline_en", headline_en);
|
||||
queryMaster.bindValue(":page_number", page_number);
|
||||
queryMaster.bindValue(":size", size);
|
||||
queryMaster.bindValue(":ave", ave);
|
||||
queryMaster.bindValue(":real_size", real_size);
|
||||
queryMaster.bindValue(":size_l", size_l);
|
||||
queryMaster.bindValue(":size_w", size_w);
|
||||
|
||||
if(!queryMaster.exec())
|
||||
{
|
||||
qDebug() << "Sql Error (updateArticle): " << queryMaster.lastError().text().toAscii();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isArabic = (publication.language() == "Arabic");
|
||||
updateTags(database, tags, isArabic);
|
||||
updateImageCutouts(database, cutoutsList);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
QList<Article> Article::preclippedArticles(QSqlDatabase &database, int publicationId, int issueNumber,
|
||||
QString &localIssuePath, QString &remoteIssuePath)
|
||||
{
|
||||
return articles(database, publicationId, issueNumber, localIssuePath, remoteIssuePath, 1);
|
||||
}
|
||||
|
||||
QList<Article> Article::clippedArticles (QSqlDatabase &database, int publicationId, int issueNumber,
|
||||
QString &localIssuePath, QString &remoteIssuePath)
|
||||
{
|
||||
return articles(database, publicationId, issueNumber, localIssuePath, remoteIssuePath, 2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
QList<Article> Article::articles(QSqlDatabase &database, int publicationId, int issueNumber,
|
||||
QString &localIssuePath, QString &remoteIssuePath, int clipping_status)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("SELECT pc.id_article, pc.id_article_section, pc.page_number, pc.type, pc.x, pc.y, pc.width, pc.height, ar.images_number, pc.id_clipping_table "
|
||||
"FROM clipping_coordinates as pc, article as ar "
|
||||
"WHERE pc.id_article = ar.id_article AND ar.id_publication = :id_publication AND ar.issue_number = :issue_number and clipping_status = :clipping_status "
|
||||
" AND ar.reject != 1 "
|
||||
" ORDER BY pc.id_article");
|
||||
query.bindValue(":id_publication", publicationId);
|
||||
query.bindValue(":issue_number", issueNumber);
|
||||
query.bindValue(":clipping_status", clipping_status);
|
||||
|
||||
if( !query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().text();
|
||||
return QList<Article> ();
|
||||
}
|
||||
|
||||
QList<Article> list;
|
||||
|
||||
int tmpId = -1;
|
||||
int articleId = 0;
|
||||
int count = 0;
|
||||
Article pc;
|
||||
|
||||
QList<ImageCutout *> cutoutsList;
|
||||
QHash<QString, QString> localpath;
|
||||
QHash<QString, QString> remotepath;
|
||||
|
||||
bool found = false;
|
||||
|
||||
while( query.next() )
|
||||
{
|
||||
//qDebug("Iterator %d", counter++);
|
||||
|
||||
tmpId = query.value(0).toInt();
|
||||
int sectionId = query.value(1).toInt();
|
||||
QString pagename = query.value(2).toString();
|
||||
pagename = QString("%1").arg(pagename, 4, QChar('0'));
|
||||
if (!pagename.endsWith(".jpg") )
|
||||
pagename += ".jpg";
|
||||
|
||||
int type = query.value(3).toInt();
|
||||
int x = query.value(4).toInt();
|
||||
int y = query.value(5).toInt();
|
||||
int w = query.value(6).toInt();
|
||||
int h = query.value(7).toInt();
|
||||
int imagesNumber = query.value(8).toInt();
|
||||
int clippingId = query.value(9).toInt();
|
||||
|
||||
if( tmpId != articleId)
|
||||
{
|
||||
found = true;
|
||||
if(count != 0)
|
||||
{
|
||||
pc.setImageCutouts(cutoutsList);
|
||||
QList<Tag> tags = Tag::loadArticleTags(database, articleId);
|
||||
pc.setTags(tags);
|
||||
pc.setImagesLocalPath(localpath);
|
||||
pc.setImagesRemotePath(remotepath);
|
||||
|
||||
list.append(pc);
|
||||
cutoutsList.clear();
|
||||
localpath.clear();
|
||||
remotepath.clear();
|
||||
|
||||
}
|
||||
articleId = tmpId;
|
||||
pc.setId(articleId);
|
||||
pc.setImagesNumber(imagesNumber);
|
||||
//cutoutsList.clear();
|
||||
//pc.setImageCutouts(cutoutsList);
|
||||
count++;
|
||||
}
|
||||
|
||||
QString localPagename = localIssuePath + QString("%1/%2").arg(sectionId).arg(pagename);
|
||||
QString remotePagename = remoteIssuePath+ QString("%1/%2").arg(sectionId).arg(pagename);
|
||||
QString sectionPagename = Section::sectionName(database, sectionId) + "/" + pagename;
|
||||
localpath [sectionPagename] = localPagename;
|
||||
remotepath[sectionPagename] = remotePagename;
|
||||
|
||||
SELECTION_AREA_TYPE stype = static_cast<SELECTION_AREA_TYPE> (type);
|
||||
ImageCutout * rect = new ImageCutout(clippingId, QPolygonF(QRectF(x, y, w, h)), 0, localPagename, stype);
|
||||
cutoutsList.append(rect);
|
||||
}
|
||||
|
||||
if(found)
|
||||
{
|
||||
pc.setImageCutouts(cutoutsList);
|
||||
QList<Tag> tags = Tag::loadArticleTags(database, articleId);
|
||||
pc.setTags(tags);
|
||||
pc.setImagesLocalPath(localpath);
|
||||
pc.setImagesRemotePath(remotepath);
|
||||
|
||||
list.append(pc);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int Article::clip(QSqlDatabase &database, Publication &publication, int created_by, QList<Tag> &tags,
|
||||
QList<ImageCutout *> &cutoutsList, QString section, qreal image_size, int images_number, int clipping_status, QString text_ocr)
|
||||
{
|
||||
|
||||
QSqlQuery queryMaster(database);
|
||||
|
||||
queryMaster.prepare("INSERT INTO article ( headline_en, publication_date, issue_number, id_publication, "
|
||||
"id_article_type, created_by, created, section, circulation, images_number, page_number, "
|
||||
"size, id_article_section, ave, real_size, clipping_status, size_l, size_w, id_zissor) "
|
||||
"VALUES"
|
||||
" (:headline_en, :publication_date, :issue_number, :id_publication, "
|
||||
":id_article_type, :created_by, NOW(), :section, :circulation, :images_number, :page_number, "
|
||||
":size, :id_article_section, :ave, :real_size, :clipping_status, :size_l, :size_w, :id_zissor) ");
|
||||
|
||||
QString headline_en = Tag::headlineEnglish(tags);
|
||||
QString publication_date = publication.currentIssue()->date();
|
||||
int issue_number = publication.currentIssue()->id();
|
||||
int id_publication = publication.id();
|
||||
int id_article_type = publication.type();
|
||||
int circulation = publication.circulation();
|
||||
int id_article_section = publication.currentIssue()->section(section).id();
|
||||
|
||||
int id_zissor = 1;
|
||||
|
||||
QString page_number = ImageCutout::pages(cutoutsList);
|
||||
|
||||
qreal size_l;
|
||||
qreal size_w;
|
||||
qreal size;
|
||||
qreal real_size;
|
||||
|
||||
getSize(publication, image_size, size_l, size_w, size, real_size, cutoutsList);
|
||||
qreal ave = calculateAVE(publication.isMagazine(), publication.adRate(), size, real_size, true);
|
||||
|
||||
queryMaster.bindValue(":headline_en", headline_en);
|
||||
queryMaster.bindValue(":publication_date", publication_date);
|
||||
queryMaster.bindValue(":issue_number", issue_number);
|
||||
queryMaster.bindValue(":images_number", images_number);
|
||||
queryMaster.bindValue(":id_publication", id_publication);
|
||||
queryMaster.bindValue(":id_article_type", id_article_type);
|
||||
queryMaster.bindValue(":created_by", created_by);
|
||||
queryMaster.bindValue(":section", section);
|
||||
queryMaster.bindValue(":page_number", page_number);
|
||||
queryMaster.bindValue(":circulation", circulation);
|
||||
queryMaster.bindValue(":size", size);
|
||||
queryMaster.bindValue(":id_article_section", id_article_section);
|
||||
queryMaster.bindValue(":ave", ave);
|
||||
queryMaster.bindValue(":real_size", real_size);
|
||||
queryMaster.bindValue(":clipping_status", clipping_status);
|
||||
queryMaster.bindValue(":size_l", size_l);
|
||||
queryMaster.bindValue(":size_w", size_w);
|
||||
queryMaster.bindValue(":id_zissor", id_zissor);
|
||||
//queryMaster.bindValue(":text_ocr", text_ocr);
|
||||
|
||||
|
||||
if(!queryMaster.exec())
|
||||
{
|
||||
qDebug() << queryMaster.lastQuery().toAscii();
|
||||
//QMessageBox::critical(this, tr("SQL Error"), queryMaster.lastError().databaseText());
|
||||
return -1;
|
||||
}
|
||||
|
||||
int id_article = 0;
|
||||
QVariant var = queryMaster.lastInsertId();
|
||||
if(var.isValid())
|
||||
id_article = var.toInt();
|
||||
|
||||
Tag::setArticleTags(database, id_article, tags);
|
||||
insertPromience(database, publication, id_article, tags, created_by);
|
||||
|
||||
//insert into the clipping coordinates table
|
||||
setCippingCoordinates(database, id_article, cutoutsList);
|
||||
|
||||
//insert towrite flag
|
||||
//get highest to write value
|
||||
int towrite = 0;
|
||||
for(int i=0; i<tags.count(); i++)
|
||||
{
|
||||
if (towrite < tags[i].towrite())
|
||||
towrite = tags[i].towrite();
|
||||
}
|
||||
|
||||
if(towrite > 0)
|
||||
{
|
||||
bool isArabic = (publication.language() == "Arabic");
|
||||
setArticleTowrite(database, id_article, towrite, isArabic);
|
||||
}
|
||||
|
||||
return id_article;
|
||||
}
|
||||
|
||||
|
||||
void Article::getSize(Publication &publication, qreal image_size, qreal &size_l, qreal &size_w, qreal &size, qreal &real_size, QList<ImageCutout *> &cutoutsList)
|
||||
{
|
||||
size_l = size_w = size = real_size = 0.0;
|
||||
qreal width, height;//, tmpsize = 0.0;
|
||||
|
||||
QHash<QString, qreal> sizes;
|
||||
if(publication.isMagazine())
|
||||
{
|
||||
QStringList tmpCount;
|
||||
|
||||
for(int i=0; i< cutoutsList.count(); i++)
|
||||
{
|
||||
width = (cutoutsList[i]->boundingRect().width()/DPI) * 2.54;
|
||||
height = (cutoutsList[i]->boundingRect().height()/DPI) * 2.54;
|
||||
|
||||
size_w += width;
|
||||
size_l += height;
|
||||
|
||||
//tmpsize += (size_w * size_l);
|
||||
qreal tmpsize = (width * height) / image_size;
|
||||
//qDebug() << cutoutsList[i]->pageName().toAscii();
|
||||
//qDebug("\t%.2f", tmpsize);
|
||||
|
||||
if(!tmpCount.contains(cutoutsList[i]->pageName()) )
|
||||
{
|
||||
tmpCount.append(cutoutsList[i]->pageName() );
|
||||
sizes[cutoutsList[i]->pageName()] = tmpsize;
|
||||
}
|
||||
else
|
||||
sizes[cutoutsList[i]->pageName()]+= tmpsize;
|
||||
|
||||
}
|
||||
size = tmpCount.count();
|
||||
|
||||
foreach ( QString key, sizes.keys() )
|
||||
real_size += sizes[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
qreal columnWidth = publication.columnWidth();
|
||||
if(!columnWidth)
|
||||
columnWidth = NEWSPAPER_COLUMN_WIDTH;
|
||||
|
||||
for(int i=0; i< cutoutsList.count(); i++)
|
||||
{
|
||||
width = (cutoutsList[i]->boundingRect().width()/DPI) * 2.54;
|
||||
height = (cutoutsList[i]->boundingRect().height()/DPI) * 2.54;
|
||||
|
||||
size_w += width;
|
||||
size_l += height;
|
||||
width /= columnWidth;
|
||||
size += width * height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
qreal Article::calculateAVE(bool isMagazine, qreal adrate, qreal size, qreal real_size, bool round)
|
||||
{
|
||||
if (isMagazine)
|
||||
{
|
||||
if (adrate > 0 )
|
||||
{
|
||||
if(round)
|
||||
{
|
||||
float ss = roundf(real_size*100.0f)/100.0f;
|
||||
return ss * adrate;
|
||||
}
|
||||
else
|
||||
return real_size * adrate;
|
||||
}
|
||||
else
|
||||
return 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( adrate > 0 )
|
||||
return size * adrate;
|
||||
else
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
void Article::setCippingCoordinates(QSqlDatabase &database, int id_article, QList<ImageCutout*> &cutoutsList)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
|
||||
query.prepare("INSERT INTO clipping_coordinates (id_article, id_article_section, page_number, type, x, y, width, height) "
|
||||
"VALUES (:id_article, :id_article_section, :page_number, :type, :x, :y, :w, :h)");
|
||||
query.bindValue(":id_article", id_article);
|
||||
|
||||
|
||||
//The name is in the format of
|
||||
// /socialhose/app/ClippingStation/cach/2009/09/10/162/9/0001.jpg
|
||||
for(int i=0; i< cutoutsList.count(); i++)
|
||||
{
|
||||
QString page = cutoutsList[i]->pageName();
|
||||
int index = page.lastIndexOf("/");
|
||||
int index2 = page.lastIndexOf("/", index-1);
|
||||
int pagenumber = page.right(page.length()-index-1).replace(".jpg", "").toInt();
|
||||
//int pagenumber2 = cutoutsList[i]->pageNumber().toInt();
|
||||
QString page_number = QString("%1").arg(pagenumber);
|
||||
|
||||
int id_section = page.mid(index2+1, abs(index2-index)-1).toInt();
|
||||
//int id_section2 = cutoutsList[i]->sectionNumber();
|
||||
|
||||
|
||||
int x = static_cast<int> (cutoutsList[i]->boundingRect().topLeft().x());
|
||||
int y = static_cast<int> (cutoutsList[i]->boundingRect().topLeft().y());
|
||||
int w = static_cast<int> (cutoutsList[i]->boundingRect().width());
|
||||
int h = static_cast<int> (cutoutsList[i]->boundingRect().height());
|
||||
int type = cutoutsList[i]->areaType();
|
||||
|
||||
query.bindValue(":id_article_section", id_section);
|
||||
query.bindValue(":page_number", page_number);
|
||||
query.bindValue(":type", type);
|
||||
query.bindValue(":x", x);
|
||||
query.bindValue(":y", y);
|
||||
query.bindValue(":w", w);
|
||||
query.bindValue(":h", h);
|
||||
|
||||
if (!query.exec())
|
||||
{
|
||||
qDebug() << "Error (clipping coordinates): "<< query.lastError().databaseText().toAscii();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Article::setArticleTowrite(QSqlDatabase &database, int idArticle, int toWrite, bool isArabic)
|
||||
{
|
||||
//advert_summary = 1
|
||||
int idSummary = 1;
|
||||
if(toWrite == 1)
|
||||
{
|
||||
QSqlQuery queryPublish(database);
|
||||
queryPublish.prepare("UPDATE article SET published=1, published_by=1, published_date=NOW(), id_summary=:id_summary WHERE id_article=:id_article AND towrite=0");
|
||||
queryPublish.bindValue(":id_summary", idSummary);
|
||||
queryPublish.bindValue(":id_article", idArticle);
|
||||
|
||||
if (!queryPublish.exec())
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
qDebug("setArticleTowrite(): [tag:1] Set article %d as published", idArticle);
|
||||
|
||||
}
|
||||
else if(toWrite == 2)
|
||||
{
|
||||
QSqlQuery queryToWrite(database), queryUnpublish(database);
|
||||
queryToWrite.prepare("UPDATE article SET towrite=1 WHERE id_article=:id_article");
|
||||
queryToWrite.bindValue(":id_article", idArticle);
|
||||
|
||||
|
||||
queryUnpublish.prepare("UPDATE article SET published=0, published_by=0, published_date='0000-00-00', id_summary=0 WHERE id_article=:id_article AND published_by=1 AND towrite=1");
|
||||
queryUnpublish.bindValue(":id_article", idArticle);
|
||||
|
||||
queryToWrite.exec();
|
||||
|
||||
queryUnpublish.exec();
|
||||
|
||||
qDebug("setArticleTowrite(): [tag:2] Set towrite and unpublished article %d", idArticle);
|
||||
}
|
||||
else if(toWrite == 3)
|
||||
{
|
||||
if(isArabic)
|
||||
{
|
||||
QSqlQuery queryToWrite(database), queryUnpublish(database);
|
||||
queryToWrite.prepare("UPDATE article SET towrite=1 WHERE id_article=:id_article");
|
||||
queryToWrite.bindValue(":id_article", idArticle);
|
||||
|
||||
queryUnpublish.prepare("UPDATE article SET published=0, published_by=0, published_date='0000-00-00', id_summary=0 WHERE id_article=:id_article AND published_by=1 AND towrite=1");
|
||||
queryUnpublish.bindValue(":id_article", idArticle);
|
||||
|
||||
queryToWrite.exec();
|
||||
|
||||
queryUnpublish.exec();
|
||||
|
||||
qDebug("setArticleTowrite(): [tag:3] Set towrite and unpublished article %d", idArticle);
|
||||
}
|
||||
}
|
||||
else
|
||||
qDebug("setArticleTowrite(): This is not supposed to happen.");
|
||||
}
|
||||
|
||||
Article Article::article(QSqlDatabase &database, int articleId, QString &localIssuePath, QString &remoteIssuePath)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("SELECT pc.id_article, pc.id_article_section, pc.page_number, pc.type, pc.x, pc.y, pc.width, pc.height, ar.images_number, pc.id_clipping_table "
|
||||
"FROM clipping_coordinates as pc, article as ar "
|
||||
"WHERE pc.id_article = ar.id_article AND ar.id_article = :id_article");
|
||||
|
||||
query.bindValue(":id_article", articleId);
|
||||
|
||||
if( !query.exec() )
|
||||
{
|
||||
qDebug() << query.lastError().databaseText();
|
||||
return Article();
|
||||
}
|
||||
|
||||
|
||||
int tmpId = -1, tmpId2 = 0;
|
||||
Article pc;
|
||||
|
||||
QList<ImageCutout *> cutoutsList;
|
||||
QHash<QString, QString> localpath;
|
||||
QHash<QString, QString> remotepath;
|
||||
|
||||
bool found = false;
|
||||
|
||||
while( query.next() )
|
||||
{
|
||||
//qDebug("Iterator %d", counter++);
|
||||
|
||||
tmpId = query.value(0).toInt();
|
||||
int sectionId = query.value(1).toInt();
|
||||
QString pagename = query.value(2).toString();
|
||||
pagename = QString("%1").arg(pagename, 4, QChar('0'));
|
||||
if (!pagename.endsWith(".jpg") )
|
||||
pagename += ".jpg";
|
||||
|
||||
int type = query.value(3).toInt();
|
||||
int x = query.value(4).toInt();
|
||||
int y = query.value(5).toInt();
|
||||
int w = query.value(6).toInt();
|
||||
int h = query.value(7).toInt();
|
||||
int imagesNumber = query.value(8).toInt();
|
||||
int clippinId = query.value(9).toInt();
|
||||
|
||||
if( tmpId != tmpId2)
|
||||
{
|
||||
found = true;
|
||||
tmpId2 = tmpId;
|
||||
|
||||
articleId = tmpId;
|
||||
pc.setId(articleId);
|
||||
pc.setImagesNumber(imagesNumber);
|
||||
|
||||
}
|
||||
|
||||
QString localPagename = localIssuePath + QString("%1/%2").arg(sectionId).arg(pagename);
|
||||
QString remotePagename = remoteIssuePath+ QString("%1/%2").arg(sectionId).arg(pagename);
|
||||
QString sectionPagename = Section::sectionName(database, sectionId) + "/" + pagename;
|
||||
localpath [sectionPagename] = localPagename;
|
||||
remotepath[sectionPagename] = remotePagename;
|
||||
|
||||
SELECTION_AREA_TYPE stype = static_cast<SELECTION_AREA_TYPE> (type);
|
||||
ImageCutout * rect = new ImageCutout(clippinId, QPolygonF(QRectF(x, y, w, h)), 0, localPagename, stype);
|
||||
cutoutsList.append(rect);
|
||||
}
|
||||
|
||||
if(found)
|
||||
{
|
||||
pc.setImageCutouts(cutoutsList);
|
||||
QList<Tag> tags = Tag::loadArticleTags(database, articleId);
|
||||
pc.setTags(tags);
|
||||
pc.setImagesLocalPath(localpath);
|
||||
pc.setImagesRemotePath(remotepath);
|
||||
}
|
||||
|
||||
return pc;
|
||||
|
||||
}
|
||||
|
||||
void Article::insertPromience(QSqlDatabase &database, Publication &publication, int idArticle, QList<Tag> &tags, int createdBy)
|
||||
{
|
||||
qDebug("insertPromience()");
|
||||
QSqlQuery query(database);
|
||||
query.prepare("INSERT INTO prominence (id_company, id_article, mention_score, visual_score, "
|
||||
"tone_score, created_by, created, size_cc, size_page, ave, note) "
|
||||
" VALUES (:id_company, :id_article, :mention_score, :visual_score, "
|
||||
":tone_score, :created_by, NOW(), :size_cc, :size_page, :ave, :note )");
|
||||
query.bindValue(":id_article", idArticle);
|
||||
|
||||
for(int i=0; i < tags.count(); i++)
|
||||
{
|
||||
Tag t = tags[i];
|
||||
|
||||
if(t.prominence().m_size <= 0)
|
||||
{
|
||||
qDebug ("Prominance for Tag (%d) has a value of zero, wont be inserted to db.", t.id() );
|
||||
continue;
|
||||
}
|
||||
|
||||
double ave = calculateAVE(publication.isMagazine(), publication.adRate(), t.prominence().m_size, t.prominence().m_size, false);
|
||||
|
||||
query.bindValue(":id_company", t.id());
|
||||
query.bindValue(":mention_score", t.prominence().m_mentionScore);
|
||||
query.bindValue(":visual_score", t.prominence().m_visualScore);
|
||||
query.bindValue(":tone_score", t.prominence().m_toneScore);
|
||||
query.bindValue(":created_by", createdBy);
|
||||
if(publication.isMagazine())
|
||||
{
|
||||
query.bindValue(":size_cc", QVariant(QVariant::Double) );
|
||||
query.bindValue(":size_page", t.prominence().m_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
query.bindValue(":size_cc", t.prominence().m_size);
|
||||
query.bindValue(":size_page", QVariant(QVariant::Double) );
|
||||
}
|
||||
|
||||
query.bindValue(":ave", ave);
|
||||
query.bindValue(":note", t.prominence().m_note);
|
||||
|
||||
if(!query.exec() )
|
||||
{
|
||||
qDebug() << "insertPromience() Sql Error " << query.lastError().text();
|
||||
qDebug() << "exe query:" << query.executedQuery();
|
||||
}
|
||||
}
|
||||
qDebug("end of insertPromience()");
|
||||
|
||||
}
|
||||
|
||||
void Article::updateProminence(QSqlDatabase &database, Publication &publication, QList<Tag> &tags, int createdBy)
|
||||
{
|
||||
qDebug("updateProminence()");
|
||||
|
||||
//delete prominence for this aricle, and re-insert them.
|
||||
QSqlQuery query(database);
|
||||
query.prepare("DELETE FROM prominence WHERE id_article = :id_article");
|
||||
query.bindValue(":id_article", m_id);
|
||||
|
||||
if(!query.exec())
|
||||
{
|
||||
//could delete all prominence to db.
|
||||
qDebug() << "updateProminence() Sql Error " << query.lastError().text();
|
||||
qDebug() << "exe query:" << query.executedQuery();
|
||||
}
|
||||
|
||||
insertPromience(database, publication, m_id, tags, createdBy);
|
||||
|
||||
qDebug("end of updateProminence()");
|
||||
}
|
||||
Reference in New Issue
Block a user