From f51c3d89d5118e45914a1de7f6bdb03dd559e32e Mon Sep 17 00:00:00 2001
From: Antonio Gallo <tonicucoz@gmail.com>
Date: Wed, 26 Jan 2011 03:05:35 +0000
Subject: added mail notifications for talk messages

---
 h-source/Application/Controllers/MyController.php |  2 +-
 h-source/Application/Include/myFunctions.php      | 20 ++++++++
 h-source/Application/Include/params.php           | 27 +++++++++++
 h-source/Application/Models/HardwareModel.php     |  5 +-
 h-source/Application/Models/NorepeatModel.php     | 35 --------------
 h-source/Application/Models/ProfileModel.php      |  8 +++-
 h-source/Application/Models/TalkModel.php         | 57 ++++++++++++++++++++++-
 7 files changed, 113 insertions(+), 41 deletions(-)
 delete mode 100644 h-source/Application/Models/NorepeatModel.php

(limited to 'h-source/Application')

diff --git a/h-source/Application/Controllers/MyController.php b/h-source/Application/Controllers/MyController.php
index c2b715f..d1e346c 100644
--- a/h-source/Application/Controllers/MyController.php
+++ b/h-source/Application/Controllers/MyController.php
@@ -158,7 +158,7 @@ class MyController extends BaseController
 		
 		if (!$this->s['registered']->checkCsrf($this->viewArgs['token'])) $this->redirect($this->controller.'/home/'.$this->lang,2,'wrong token..');
 		
-		$this->m['ProfileModel']->setFields('real_name,website,where_you_are,birth_date,fav_distro,projects,publish_mail,description','sanitizeAll');
+		$this->m['ProfileModel']->setFields('real_name,website,where_you_are,birth_date,fav_distro,projects,publish_mail,send_notification,description','sanitizeAll');
 		
 		$clean['id_user'] = (int)$this->s['registered']->status['id_user'];
 		
diff --git a/h-source/Application/Include/myFunctions.php b/h-source/Application/Include/myFunctions.php
index 7e509cd..5c64317 100644
--- a/h-source/Application/Include/myFunctions.php
+++ b/h-source/Application/Include/myFunctions.php
@@ -392,3 +392,23 @@ function goToModeratedItem( $row = array() )
 	}
 	return 'http://'.DOMAIN_NAME.'/'.$url;
 }
+
+function getUrlsFromIdHard($id_hard)
+{
+	$clean['id_hard'] = (int)$id_hard;
+	
+	$urlView = "http://".DOMAIN_NAME;
+	$urlTalk = "http://".DOMAIN_NAME;
+	
+	$hard = new HardwareModel();
+	$res = $hard->select('type,model')->where(array('id_hard'=>$clean['id_hard']))->send();
+	if (count($res) > 0)
+	{
+		$urlView = "http://".DOMAIN_NAME."/".MyStrings::$reverse[$res[0]['hardware']['type']]."/view/".Lang::$current."/".$clean['id_hard']."/".encodeUrl($res[0]['hardware']['model']);
+		
+		$urlTalk = "http://".DOMAIN_NAME."/".MyStrings::$reverse[$res[0]['hardware']['type']]."/talk/".Lang::$current."/".$clean['id_hard'];
+	}
+	
+	return array('urlView'=>$urlView,'urlTalk'=>$urlTalk);
+	
+}
\ No newline at end of file
diff --git a/h-source/Application/Include/params.php b/h-source/Application/Include/params.php
index 7547643..1d3533b 100644
--- a/h-source/Application/Include/params.php
+++ b/h-source/Application/Include/params.php
@@ -141,5 +141,32 @@ class Account
 		}
 		
 	}
+
+	static public function sendTalkNotice($who,$e_mails,$id_hard)
+	{
+		require_once (ROOT.'/External/swiftmailer/lib/swift_required.php');
+
+		$who = sanitizeAll($who);
+		$id_hard = (int)$id_hard;
+		
+		$siteName = Website::$generalName;
+		$siteMail = Website::$generalMail;
+
+		$urls = getUrlsFromIdHard($id_hard);
+		
+		$mess = "$who has added a message to the talk page of a device you have contributed to maintain at $siteName\n\nThe whole conversation is here:\n\n".$urls['urlTalk']."\n\nThe device page is here:\n\n".$urls['urlView']."\n\nBest regards\nthe ".Website::$projectName." team\n\nP.S: you can disable the mail notifications in the profile page of your control panel";
+
+		$message = Swift_Message::newInstance()->setSubject("$who sent a notice to your attention")->setFrom(array($siteMail => $siteName))->setTo($e_mails)->setBody($mess);
+
+		//Create the Transport
+		$transport = Swift_SmtpTransport::newInstance(Website::$mailServer, 25)->setUsername(Website::$generalMail)->setPassword(Website::$mailPassword);
+
+		//Create the Mailer using your created Transport
+		$mailer = Swift_Mailer::newInstance($transport);
+
+		//Send the message
+		$result = $mailer->batchSend($message);
+
+	}
 	
 }
\ No newline at end of file
diff --git a/h-source/Application/Models/HardwareModel.php b/h-source/Application/Models/HardwareModel.php
index fb41fa3..d4c9a47 100644
--- a/h-source/Application/Models/HardwareModel.php
+++ b/h-source/Application/Models/HardwareModel.php
@@ -39,8 +39,9 @@ class HardwareModel extends Model_Map {
 		$this->_tables='hardware,regusers,hardware_users';
 		$this->_idFields='id_hard,id_user';
 		$this->_where=array(
-			'type'		=>	'hardware',
-			'username'	=>	'regusers',
+			'type'				=>	'hardware',
+			'username'			=>	'regusers',
+			'id_user'			=>	'regusers',
 			'has_confirmed'		=>	'regusers',
 			'deleted'			=>	'regusers',
 			'-deleted'			=>	'hardware'
diff --git a/h-source/Application/Models/NorepeatModel.php b/h-source/Application/Models/NorepeatModel.php
deleted file mode 100644
index 39938b6..0000000
--- a/h-source/Application/Models/NorepeatModel.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-// h-source, a web software to build a community of people that want to share their hardware information.
-// Copyright (C) 2010  Antonio Gallo (h-source-copyright.txt)
-//
-// This file is part of h-source
-//
-// h-source is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-// 
-// h-source is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// 
-// You should have received a copy of the GNU General Public License
-// along with h-source.  If not, see <http://www.gnu.org/licenses/>.
-
-if (!defined('EG')) die('Direct access not allowed!');
-
-class NorepeatModel extends Model_Tree {
-
-	public function insert()
-	{
-		parent::insert();
-		if ($this->queryResult)
-		{
-			header('Refresh: 0;url=http://'.DOMAIN_NAME.$_SERVER['REQUEST_URI']);
-			exit;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/h-source/Application/Models/ProfileModel.php b/h-source/Application/Models/ProfileModel.php
index 6c0071f..c8818b4 100644
--- a/h-source/Application/Models/ProfileModel.php
+++ b/h-source/Application/Models/ProfileModel.php
@@ -35,7 +35,8 @@ class ProfileModel extends Model_Tree {
 		$this->softConditions['update'] = array(
 			"checkLength|90"	=>	"real_name,where_you_are,fav_distro,birth_date,website|the fields 'real name', 'where_you_are', 'favorite distro', 'website' and 'birthdate' don't have to have more than 90 characters",
 			"checkLength|1000"	=>	"projects,description|the fields 'projects' and 'description' don't have to have more than 1000 characters",
-			"checkIsStrings|no,yes"	=>	"publish_mail"
+			"checkIsStrings|no,yes"	=>	"publish_mail",
+			"+checkIsStrings|no,yes"	=>	"send_notification"
 		);
 		
 		parent::__construct();
@@ -58,6 +59,11 @@ class ProfileModel extends Model_Tree {
 				'options'	=>	'no,yes',
 				'labelString'=>	'Would you like to publish your e-mail address?'
 			),
+			'send_notification'		=>	array(
+				'type'		=>	'Select',
+				'options'	=>	'yes,no',
+				'labelString'=>	'Would you like to receive mail notifications?'
+			),
 			'description'	=>	array(
 				'type'		=>	'Textarea',
 				'labelString'=>	'Your description'
diff --git a/h-source/Application/Models/TalkModel.php b/h-source/Application/Models/TalkModel.php
index d6d935b..e29e073 100644
--- a/h-source/Application/Models/TalkModel.php
+++ b/h-source/Application/Models/TalkModel.php
@@ -20,14 +20,16 @@
 
 if (!defined('EG')) die('Direct access not allowed!');
 
-class TalkModel extends NorepeatModel {
+class TalkModel extends Model_Tree {
 
 	public function __construct() {
 		$this->_tables = 'talk';
 		$this->_idFields = 'id_talk';
 		
 		$this->_where=array(
-			'id_hard'	=>	'talk'
+			'id_hard'			=>	'talk',
+			'has_confirmed'		=>	'regusers',
+			'-deleted'			=>	'regusers',
 		);
 		
 		$this->orderBy = 'talk.id_talk desc';
@@ -41,6 +43,57 @@ class TalkModel extends NorepeatModel {
 		parent::__construct();
 	}
 
+	public function insert()
+	{
+		if (parent::insert())
+		{
+			if (strcmp($this->values['id_hard'],0) !== 0)
+			{
+				$clean['id_hard'] = (int)$this->values['id_hard'];
+				$clean['created_by'] = (int)$this->values['created_by'];
+				
+				$hard = new HardwareModel();
+				$users = $hard->select('username,e_mail')
+					->where(array('id_hard'=>$clean['id_hard'],'has_confirmed'=>0,'deleted'=>'no'))
+					->toList('regusers.username','regusers.e_mail')
+					->send('Boxes');
+
+				$talkUsers = $this->select('username,e_mail')
+					->from('talk inner join regusers')
+					->on('talk.created_by = regusers.id_user')
+					->where(array('id_hard'=>$clean['id_hard'],'has_confirmed'=>0,'-deleted'=>'no'))
+					->toList('regusers.username','regusers.e_mail')
+					->send();
+
+				$allUsers = array_merge($users,$talkUsers);
+				
+				$userObj = new UsersModel();
+				$myName = $userObj->getUser($clean['created_by']);
+
+				$arrayE = new ArrayExt();
+				$fusers = $arrayE->subsetComplementary($allUsers,$myName);
+
+				//remove users that do not want the email notification
+				$inString = "'".implode("','",array_keys($fusers))."'";
+				$profile = new ProfileModel();
+				$ffusers = $profile->select('username,e_mail')
+					->from('regusers inner join profile')
+					->on('regusers.id_user = profile.created_by')
+					->where(array('send_notification'=>'yes','username'=>"in($inString)"))
+					->toList('regusers.username','regusers.e_mail')
+					->send();
+
+				$ffusers = array_flip($ffusers);
+				
+				//send the notice
+				Account::sendTalkNotice($myName,$ffusers,$clean['id_hard']);
+
+				header('Refresh: 0;url=http://'.DOMAIN_NAME.$_SERVER['REQUEST_URI']);
+				exit;
+			}
+		}
+	}
+
 	public $formStruct = array(
 		'entries' 	=> 	array(
 			'title'	=> 	array(),
-- 
cgit v1.2.3