protected function execute($arguments = array(), $options = array())
 {
     $context = sfContext::createInstance($this->configuration);
     // initialize the database connection
     $databaseManager = new sfDatabaseManager($this->configuration);
     $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
     $table = PetitionSigningTable::getInstance();
     $con = $table->getConnection();
     $silent = $options['silent'];
     $duration = (int) $options['duration'];
     $once = (bool) $options['once'];
     $limit = (int) $options['limit'];
     $petition_id = (int) $options['action_id'];
     $time = gmdate('Y-m-d H:i:s');
     $signings = $table->queryPendingSignings($duration, $once, $petition_id)->limit($limit)->execute();
     foreach ($signings as $signing) {
         /* @var $signing PetitionSigning */
         if (!$silent) {
             echo $signing->getId() . "\t" . $signing->getEmail() . "\n";
         }
         UtilEmailValidation::send($signing, 'Reminder:');
         $signing->setMailedAt($time);
         //      $signing->save();
     }
     $signings->save();
     if (!$silent) {
         echo "done.\n";
     }
 }
 protected function execute($arguments = array(), $options = array())
 {
     $context = sfContext::createInstance($this->configuration);
     // initialize the database connection
     $databaseManager = new sfDatabaseManager($this->configuration);
     $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
     $table = PetitionSigningTable::getInstance();
     $con = $table->getConnection();
     $silent = $options['silent'];
     $duration = (int) $options['duration'];
     $limit = (int) $options['limit'];
     $petition_id = (int) $options['action_id'];
     $time = gmdate('Y-m-d H:i:s');
     $signings = $table->queryPendingSigningsSinceCreation($duration, $petition_id)->limit($limit)->execute();
     foreach ($signings as $signing) {
         /* @var $signing PetitionSigning */
         if (!$silent) {
             echo $signing->getId() . "\t" . $signing->getEmail() . "\n";
         }
         $con->exec('update petition set deleted_pendings = deleted_pendings + 1 where id = ?', array($signing->getPetitionId()));
         $signing->delete();
     }
     if (!$silent) {
         echo "done.\n";
     }
 }
 public function executeOpen_actions()
 {
     // Javascript vars
     $this->tags = array('policat' => '');
     // UtilRegistry::get('twitter_tags')
     $this->widget_styles = array();
     // Open petitions
     $this->open = array();
     foreach (array(self::HOTTEST => 'Trending', self::LARGEST => 'Popular', self::RECENT => 'New') as $key => $value) {
         $data = $this->getPetitions($key);
         $this->tags[$key] = '';
         foreach ($data as &$petition) {
             $count = PetitionSigningTable::getInstance()->countByPetition($petition['id'], null, null, 60);
             $count += PetitionApiTokenTable::getInstance()->sumOffsets($petition['id'], 60);
             $count += $petition['addnum'];
             $petition['signings'] = $count;
             $text = $petition['PetitionText'][0];
             $widget = $text['DefaultWidget'];
             $style = json_decode($widget['stylings'], true);
             $tags = trim($petition['twitter_tags']);
             if ($tags) {
                 $this->tags[$key] .= ($this->tags[$key] ? ' OR ' : '') . $petition['twitter_tags'];
             }
             if (!isset($this->widget_styles[$widget['id']])) {
                 $this->widget_styles[$widget['id']] = array('width' => $style['width'], 'body_color' => '#818286', 'count' => number_format($petition['signings'], 0, '.', ',') . ' people so far', 'target' => $petition['signings'] . '-' . Petition::calcTarget($petition['signings'], $petition['target_num']), 'url' => $this->getContext()->getRouting()->generate('sign', array('id' => $widget['id'], 'hash' => Widget::calcLastHash($widget['id'], array($petition['object_version'], $widget['object_version'], $text['object_version']))), true));
             }
         }
         $this->open[$key] = array('title' => $value, 'data' => $data);
         //      $this->js['tags'][$key] .= ($this->js['tags'][$key] ? ' OR ' : '') . $this->js['tags']['policat'];
     }
 }
 protected function execute($arguments = array(), $options = array())
 {
     // initialize the database connection
     $databaseManager = new sfDatabaseManager($this->configuration);
     $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
     $signings_table = PetitionSigningTable::getInstance();
     $search_table = PetitionSigningSearchTable::getInstance();
     $q = $signings_table->createQuery('s')->select('min(s.id)');
     if ($options['min']) {
         $q->andWhere('s.id >= ?', $options['min']);
     }
     $min = $q->fetchArray();
     $min = reset($min);
     $min = reset($min);
     $q = $signings_table->createQuery('s')->select('max(s.id)');
     if ($options['max']) {
         $q->andWhere('s.id <= ?', $options['max']);
     }
     $max = $q->fetchArray();
     $max = reset($max);
     $max = reset($max);
     printf("min: %s\n", $min);
     printf("max: %s\n", $max);
     $pos = $min;
     if ($options['spawn']) {
         $step = 10000;
         while ($pos <= $max) {
             echo 'CALL ' . $pos . ' ' . ($pos + $step) . PHP_EOL;
             $lastline = system('php symfony policat:signings-search --min=' . $pos . ' --max=' . ($pos + $step));
             echo $lastline . PHP_EOL;
             $pos += $step;
         }
         return;
     }
     $step = 1000;
     while ($pos <= $max) {
         $query = $signings_table->createQuery('s')->where('s.id >= ? and s.id < ?', array($pos, $pos + $step));
         $signings = $query->execute();
         printf("step: %s - %s\n", $pos, $pos + $step - 1);
         foreach ($signings as $signing) {
             /* @var $signing PetitionSigning */
             //        printf("s: %s\n", $signing->getId());
             $search_table->savePetitionSigning($signing);
             $signing->free();
         }
         $query->free();
         $pos += $step;
     }
 }
 function executeList()
 {
     $page = isset($this->page) ? $this->page : 1;
     $this->show_petition = false;
     $this->show_subscriber = true;
     $this->show_status = false;
     $this->show_email = false;
     $this->download_filter = null;
     $this->action = '';
     $this->route = null;
     $this->route_params = array();
     $data_owner_id = null;
     if (isset($this->campaign)) {
         $query = PetitionSigningTable::getInstance()->query(array(PetitionSigningTable::CAMPAIGN => $this->campaign, PetitionSigningTable::ORDER => PetitionSigningTable::ORDER_DESC));
         $this->form = new SigningsDownloadForm(array(), array(PetitionSigningTable::CAMPAIGN => $this->campaign, PetitionSigningTable::ORDER => PetitionSigningTable::ORDER_DESC, SigningsDownloadForm::OPTION_QUERY => $query->copy(), SigningsDownloadForm::OPTION_IS_DATA_OWNER => $this->getGuardUser()->isDataOwnerOfCampaign($this->campaign)));
         $this->form->bindSelf('c' . $this->campaign->getId());
         $this->route = 'data_campaign_pager';
         $this->route_params = array('id' => $this->campaign->getId());
         $this->show_petition = true;
         $data_owner_id = $this->campaign->getDataOwnerId();
     } elseif (isset($this->petition)) {
         $query = PetitionSigningTable::getInstance()->query(array(PetitionSigningTable::PETITION => $this->petition, PetitionSigningTable::ORDER => PetitionSigningTable::ORDER_DESC));
         $this->form = new SigningsDownloadForm(array(), array(PetitionSigningTable::PETITION => $this->petition, PetitionSigningTable::ORDER => PetitionSigningTable::ORDER_DESC, SigningsDownloadForm::OPTION_QUERY => $query->copy(), SigningsDownloadForm::OPTION_IS_DATA_OWNER => $this->getGuardUser()->isDataOwnerOfCampaign($this->petition->getCampaign())));
         $this->form->bindSelf('p' . $this->petition->getId());
         $this->route = 'data_petition_pager';
         $this->route_params = array('id' => $this->petition->getId());
         $data_owner_id = $this->petition->getCampaign()->getDataOwnerId();
     } elseif (isset($this->widget)) {
         // this is for widget owners only
         $query = PetitionSigningTable::getInstance()->query(array(PetitionSigningTable::WIDGET => $this->widget, PetitionSigningTable::USER => $this->getGuardUser(), PetitionSigningTable::ORDER => PetitionSigningTable::ORDER_DESC));
         $this->form = new SigningsDownloadForm(array(), array(PetitionSigningTable::WIDGET => $this->widget, PetitionSigningTable::USER => $this->getGuardUser(), PetitionSigningTable::ORDER => PetitionSigningTable::ORDER_DESC, SigningsDownloadForm::OPTION_QUERY => $query->copy(), SigningsDownloadForm::OPTION_IS_DATA_OWNER => true));
         $this->form->bindSelf('w' . $this->widget->getId());
         $this->route = 'data_widget_pager';
         $this->route_params = array('id' => $this->widget->getId());
         $data_owner_id = $this->widget->getCampaign()->getDataOwnerId();
     }
     $this->can_delete = $this->getUser()->getUserId() == $data_owner_id;
     $this->signings = new policatPager($query, $page, $this->route, $this->route_params, true, 20, $this->form);
     if ($this->form->isValid()) {
         $this->count = $this->form->getCount();
         $this->pages = UtilExport::pages($this->count);
         $this->pending = $this->form->getPending();
         $this->download_filter = array($this->form->getName() => $this->form->getValues());
         $this->show_subscriber = !$this->form->getSubscriber();
         $this->show_email = $this->form->getSubscriber();
     }
 }
 protected function execute($arguments = array(), $options = array())
 {
     $context = sfContext::createInstance($this->configuration);
     if ($options['loop']) {
         $max_load = (double) $options['maxload'];
         echo "maxload: {$max_load}\n";
         do {
             $lastline = system('php symfony policat:email-hash-worker');
             echo PHP_EOL;
             $load = sys_getloadavg();
             $maxwait = 250;
             $waited = 0;
             while ($load[0] > $max_load && $maxwait--) {
                 sleep(1);
                 $waited++;
                 $load = sys_getloadavg();
             }
             if ($waited) {
                 echo "waited {$waited} s\n";
             }
             usleep(500000);
             // 0.5s
         } while (strpos($lastline, 'nothing to do') === false);
     } else {
         // initialize the database connection
         $databaseManager = new sfDatabaseManager($this->configuration);
         $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
         $table = PetitionSigningTable::getInstance();
         $con = $table->getConnection();
         $petition_signings = $table->createQuery('ps')->select('ps.id, ps.email')->where('ps.status = ? and ps.email_hash IS NULL', PetitionSigning::STATUS_VERIFIED)->limit(100)->execute(array(), Doctrine_Core::HYDRATE_ARRAY_SHALLOW);
         $count = count($petition_signings);
         if ($count) {
             echo "processing {$count} signings...";
             foreach ($petition_signings as $row) {
                 $con->exec('UPDATE petition_signing SET email_hash = ? WHERE id = ?', array(UtilEmailHash::hash($row['email']), $row['id']));
             }
             echo " done.";
         } else {
             echo "nothing to do.";
         }
     }
 }
 public function executeValidate(sfWebRequest $request)
 {
     if ($request->hasParameter('code')) {
         $idcode = $request->getParameter('code');
         if (is_string($idcode)) {
             $idcode = explode('-', trim($idcode));
         }
         if (is_array($idcode) && count($idcode) === 2) {
             list($this->id, $code) = $idcode;
             $this->id = ltrim($this->id, '0 ');
             $petition_signing = PetitionSigningTable::getInstance()->fetch($this->id);
             if (!empty($petition_signing)) {
                 $petition = $petition_signing->getPetition();
                 $widget = $petition_signing->getWidget();
                 $this->lang = $widget->getPetitionText()->getLanguageId();
                 $this->getContext()->getI18N()->setCulture($this->lang);
                 $this->getUser()->setCulture($this->lang);
                 /* @var $petition_signing PetitionSigning */
                 /* @var $petition Petition */
                 $wave = null;
                 if ($petition->isGeoKind()) {
                     foreach ($petition_signing['PetitionSigningWave'] as $psw) {
                         if ($psw['validation_data'] === $code) {
                             $wave = $psw;
                             break;
                         }
                     }
                 }
                 if ($code === $petition_signing->getValidationData() && !$petition->isGeoKind() || $wave) {
                     if ($petition_signing->getStatus() == PetitionSigning::STATUS_PENDING || $wave && $wave->getStatus() == PetitionSigning::STATUS_PENDING) {
                         if ($petition->isEmailKind()) {
                             if ($petition->isGeoKind()) {
                                 $petition_signing->setWaveCron($petition_signing->getWavePending());
                                 $wave->setStatus(PetitionSigning::STATUS_VERIFIED);
                             } else {
                                 // regular email action, send mail now
                                 $subject = $petition_signing->getField(Petition::FIELD_EMAIL_SUBJECT);
                                 $body = $petition_signing->getField(Petition::FIELD_EMAIL_BODY);
                                 $email_targets = $petition->getEmailTargets();
                                 if (is_string($email_targets)) {
                                     $email_targets = json_decode($email_targets, true);
                                 }
                                 if (is_array($email_targets) && count($email_targets)) {
                                     $petition_text = $widget->getPetitionText()->getEmailBody();
                                     if ($petition_text) {
                                         UtilMail::appendMissingKeywords($body, $petition_text, PetitionSigningTable::$KEYWORDS);
                                     }
                                     /* Email to target */
                                     UtilMail::send(null, $petition_signing->getEmailContact($petition->getFromEmail(), true), $email_targets, $subject, $body, null, $petition_signing->getSubst($this->lang), null, $petition_signing->getEmailContact());
                                 }
                             }
                         }
                         $petition_signing->setStatus(PetitionSigning::STATUS_VERIFIED);
                         $petition_signing->setEmailHash($petition_signing->getEmailHashAuto());
                         $petition_signing->save();
                     }
                     $this->ref = $petition_signing->getField(Petition::FIELD_REF);
                     $this->wid = $petition_signing->getWidgetId();
                     $this->landing_url = $widget->findLandingUrl($petition);
                     if ($this->landing_url) {
                         $this->setLayout(false);
                         $this->setTemplate('landing');
                     }
                     return;
                 }
             }
         }
         $this->setLayout(false);
         $this->setTemplate('fail');
     }
 }
 /**
  * Executes actionSignings action
  *
  * @param sfRequest $request A request object
  */
 public function executeActionSignings(sfWebRequest $request)
 {
     $this->setLayout(false);
     $response = $this->getResponse();
     // does the client want JSONP?
     $callback = trim(preg_replace('/[^a-z_.]/i', '', $request->getParameter('callback', null)));
     // determine the requested action (petition)
     $action_id = $request->getParameter('action_id');
     if (!is_numeric($action_id) || $action_id < 0) {
         $response->setStatusCode(400);
         return $this->renderJson(array('status' => 'error', 'message' => 'bad action ID given'), $callback);
     }
     $petition = PetitionTable::getInstance()->findByIdCachedActive($action_id);
     if (!$petition) {
         $response->setStatusCode(404);
         return $this->renderJson(array('status' => 'error', 'message' => 'action could not be found'), $callback);
     }
     $signings_table = PetitionSigningTable::getInstance();
     $token_table = PetitionApiTokenTable::getInstance();
     $timeToLive = 60;
     $refresh = false;
     $token_code = $request->getPostParameter('token');
     if ($token_code) {
         $token = $token_table->fetchByPetitionAndToken($petition, $token_code, PetitionApiTokenTable::STATUS_ACTIVE);
         if (!$token) {
             return $this->renderJson(array('status' => 'error', 'message' => 'token wrong'), $callback);
         }
         $foreign_singings = $request->getPostParameter('signings', null);
         if ($foreign_singings) {
             if (is_array($foreign_singings)) {
                 $offsets = ApiTokenOffsetTable::getInstance()->fetchOffsetsByToken($token);
                 $change = false;
                 foreach ($foreign_singings as $country_code => $country_addnum) {
                     if (preg_match('/^[a-z]{2}$/i', $country_code) && preg_match('/^-?[0-9]+$/i', $country_addnum)) {
                         $country_code = strtoupper($country_code);
                         if ($offsets->contains($country_code)) {
                             $offset = $offsets->get($country_code);
                             /* @var $offset ApiTokenOffset */
                             if ($offset->getAddnum() != $country_addnum) {
                                 $offset->setAddnum($country_addnum);
                                 $change = true;
                             }
                         } else {
                             $offset = new ApiTokenOffset();
                             $offset->setApiToken($token);
                             $offset->setCountry($country_code);
                             $offset->setAddnum($country_addnum);
                             $change = true;
                             $offset->save();
                         }
                     }
                 }
                 if ($change) {
                     $offsets->save();
                     $refresh = true;
                 }
             } else {
                 return $this->renderJson(array('status' => 'error', 'message' => 'wrong format'), $callback);
             }
         }
     }
     // widget filter: collect desired widget ids (comma separated list)
     $widget_ids = $request->getParameter('widgets', '');
     if ($widget_ids) {
         if ($widget_ids === true || $widget_ids === 'true' || $widget_ids === 'TRUE') {
             $widget_ids = true;
         } else {
             $widget_ids = array_filter(array_unique(array_map('intval', explode(',', $widget_ids))));
         }
     } else {
         $widget_ids = null;
     }
     // prepare date range filter
     $min_date = $request->getParameter('from_via_policat', null);
     $max_date = $request->getParameter('to_via_policat', null);
     $with_date = $min_date !== null || $max_date !== null;
     if ($min_date !== null && $max_date !== null && $min_date > $max_date) {
         $t = $min_date;
         $min_date = $max_date;
         $max_date = $t;
     }
     $min_date = (int) $min_date;
     $max_date = (int) $max_date;
     $segregate = $request->getParameter('segregate');
     $by_countries = $segregate === 'countries';
     $data = array('action_id' => (int) $action_id);
     //    // as per customer requests, we only add the addnum stuff when we are NOT filtering by widget(s)
     //    if (empty($widgets) && !$countryFilter && !$min_date && !$max_date) {
     //      $data['signings'] += $add_num;
     //    }
     if ($widget_ids) {
         foreach (WidgetTable::getInstance()->fetchIdsByPetition($petition) as $widget_id) {
             if ($widget_ids === true || is_array($widget_ids) && in_array($widget_id, $widget_ids)) {
                 if (!array_key_exists('widgets', $data)) {
                     $data['widgets'] = array();
                     $data['widget_first_signing'] = array();
                     $data['widget_last_signing'] = array();
                 }
                 if ($by_countries) {
                     $widget_data = $signings_table->countByWidgetCountries($widget_id, $min_date, $max_date, $timeToLive, $refresh);
                 } else {
                     $widget_data = $signings_table->countByWidget($widget_id, $min_date, $max_date, $timeToLive, $refresh);
                 }
                 $data['widgets'][(int) $widget_id] = $widget_data;
                 if ($widget_data) {
                     $widget_min_max = $signings_table->fetchSigningDateRange(array_keys($data['widgets']), $min_date, $max_date, $timeToLive, $refresh);
                     if ($widget_min_max) {
                         $data['widget_first_signing'][(int) $widget_id] = strtotime($widget_min_max['min_created']);
                         $data['widget_last_signing'][(int) $widget_id] = strtotime($widget_min_max['max_created']);
                     }
                 }
                 $data['widgets_first_signing'] = min($data['widget_first_signing']);
                 $data['widgets_last_signing'] = max($data['widget_last_signing']);
             }
         }
     }
     if ($by_countries) {
         $data['signings_via_policat'] = $signings_table->countByPetitionCountries($action_id, $min_date, $max_date, $timeToLive, $refresh);
     } else {
         $data['signings_via_policat'] = $signings_table->countByPetition($action_id, $min_date, $max_date, $timeToLive, $refresh);
     }
     if ($data['signings_via_policat']) {
         $action_min_max = $signings_table->fetchSigningDateRangeByPetition($action_id, $min_date, $max_date, $timeToLive, $refresh);
         if ($action_min_max) {
             $data['policat_first_signing'] = strtotime($action_min_max['min_created']);
             $data['policat_last_signing'] = strtotime($action_min_max['max_created']);
         }
     }
     if ($by_countries) {
         $data['signings_via_api'] = $token_table->sumOffsetsCountry($action_id, $timeToLive, $refresh);
     } else {
         $data['signings_via_api'] = $token_table->sumOffsets($action_id, $timeToLive, $refresh);
     }
     $data['manual_counter_tweak'] = (int) $petition->getAddNum();
     if (!$with_date) {
         if ($by_countries) {
             $total = array();
             foreach ($data['signings_via_policat'] as $country => $num) {
                 $total[$country] = $num;
             }
             if (array_key_exists('unknown', $total)) {
                 $total['unknown'] = 0;
             }
             $total['unknown'] += $data['manual_counter_tweak'];
             foreach ($data['signings_via_api'] as $country => $num) {
                 if (array_key_exists($country, $total)) {
                     $total[$country] += $num;
                 } else {
                     $total[$country] = $num;
                 }
             }
         } else {
             $total = $data['signings_via_api'] + $data['signings_via_policat'] + $data['manual_counter_tweak'];
         }
         $data['signings_total'] = $total;
     }
     $response->addCacheControlHttpHeader('public');
     $response->addCacheControlHttpHeader('max-age', 60);
     return $this->renderJson($data, $callback);
 }
 protected function execute($arguments = array(), $options = array())
 {
     $context = sfContext::createInstance($this->configuration);
     $i18n = $context->getI18N();
     // initialize the database connection
     $databaseManager = new sfDatabaseManager($this->configuration);
     $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
     $petition_text_by_lang = array();
     $table = PetitionSigningTable::getInstance();
     $con = $table->getConnection();
     $con->beginTransaction();
     try {
         $petition_signing = $table->createQuery('ps')->addFrom('ps.PetitionSigningWave psw')->where('ps.wave_cron > 0')->andWhere('DATE_SUB(NOW(),INTERVAL 2 MINUTE) > ps.updated_at')->andWhere('psw.status = ?', PetitionSigning::STATUS_VERIFIED)->orderBy('ps.created_at DESC')->fetchOne();
         if (empty($petition_signing)) {
             echo "nothing pending. (stop)";
             $connection->rollback();
             return;
         }
         /* @var $petition_signing PetitionSigning */
         $petition = $petition_signing->getPetition();
         /* @var $petition Petition */
         $is_pledge = $petition->getKind() == Petition::KIND_PLEDGE;
         $waves_verified = array();
         foreach ($petition_signing->getPetitionSigningWave() as $wave) {
             if ($wave->getStatus() == PetitionSigning::STATUS_VERIFIED) {
                 $waves_verified[] = $wave->getWave();
                 $wave->setStatus(PetitionSigning::STATUS_SENT);
             }
         }
         $contacts = ContactTable::getInstance()->createQuery('c')->addFrom('c.PetitionSigningContact psc')->where('psc.petition_signing_id = ?', $petition_signing->getId())->andWhereIn('psc.wave', $waves_verified)->addFrom('c.ContactMeta cm')->addFrom('cm.MailingListMetaChoice mlmc')->fetchArray();
         $subst_fields = $petition_signing->getPetition()->getGeoSubstFields();
         $i = 0;
         foreach ($contacts as $contact) {
             $subst = $petition_signing->getSubst();
             foreach ($subst_fields as $pattern => $subst_field) {
                 switch ($subst_field['type']) {
                     case 'fix':
                         $subst[$pattern] = $contact[$subst_field['id']];
                         break;
                     case 'free':
                         $subst[$pattern] = '';
                         foreach ($contact['ContactMeta'] as $cm) {
                             if ($cm['mailing_list_meta_id'] == $subst_field['id']) {
                                 $subst[$pattern] = $cm['value'];
                             }
                         }
                         break;
                     case 'choice':
                         $subst[$pattern] = '';
                         foreach ($contact['ContactMeta'] as $cm) {
                             if ($cm['mailing_list_meta_id'] == $subst_field['id']) {
                                 $subst[$pattern] = $cm['MailingListMetaChoice']['choice'];
                             }
                         }
                         break;
                 }
             }
             $wave = $petition_signing->getWave($contact['PetitionSigningContact'][0]['wave']);
             $wave_lang_id = $wave->getLanguageId();
             if ($wave_lang_id) {
                 $i18n->setCulture($wave_lang_id);
             }
             if ($contact['gender'] == Contact::GENDER_FEMALE) {
                 $personal_salutation = $i18n->__('Dear Madam %F %L,', array('%F' => $contact['firstname'], '%L' => $contact['lastname']));
             } elseif ($contact['gender'] == Contact::GENDER_MALE) {
                 $personal_salutation = $i18n->__('Dear Sir %F %L,', array('%F' => $contact['firstname'], '%L' => $contact['lastname']));
             } else {
                 $personal_salutation = $i18n->__('Dear Sir/Madam %F %L,', array('%F' => $contact['firstname'], '%L' => $contact['lastname']));
             }
             $personal_salutation .= "\n\n";
             $subst[PetitionTable::KEYWORD_PERSONAL_SALUTATION] = $personal_salutation;
             if ($wave) {
                 if ($is_pledge) {
                     $petition_contact = PetitionContactTable::getInstance()->findOneByPetitionIdAndContactId($petition->getId(), $contact['id']);
                     if (!$petition_contact) {
                         $petition_contact = new PetitionContact();
                         $petition_contact->setPetitionId($petition->getId());
                         $petition_contact->setContactId($contact['id']);
                         $new_secret = '';
                         while (strlen($new_secret) < 15) {
                             $new_secret .= strtoupper(strtr(base_convert(mt_rand(), 10, 36), array('0' => '', 'o' => '')));
                         }
                         $petition_contact->setSecret(substr($new_secret, 0, 15));
                         $petition_contact->save();
                     }
                     $secret = $petition_contact->getSecret();
                     $subst['#PLEDGE-URL#'] = $this->getRouting()->generate('pledge_contact', array('petition_id' => $petition->getId(), 'contact_id' => $contact['id'], 'secret' => $secret), true);
                 }
                 if (array_key_exists($contact['language_id'], $petition_text_by_lang)) {
                     $petition_text = $petition_text_by_lang[$contact['language_id']];
                 } else {
                     $petition_text = PetitionTextTable::getInstance()->fetchByPetitionAndPrefLang($petition, $contact['language_id'], Doctrine_Core::HYDRATE_ARRAY);
                     $petition_text_by_lang[$contact['language_id']] = $petition_text;
                 }
                 if ($petition->getKind() == Petition::KIND_PLEDGE) {
                     if ($petition_text) {
                         $subject = $petition_text['email_subject'];
                         $body = $petition_text['email_body'];
                     } else {
                         $subject = $body = '';
                     }
                 } else {
                     $subject = $wave->getField(Petition::FIELD_EMAIL_SUBJECT);
                     $body = $wave->getField(Petition::FIELD_EMAIL_BODY);
                 }
                 if ($petition_text) {
                     UtilMail::appendMissingKeywords($body, $petition_text['email_body'], PetitionSigningTable::$KEYWORDS);
                 }
                 $i++;
                 try {
                     /* Email to target  */
                     UtilMail::send(null, $wave->getEmailContact($petition->getFromEmail(), true), array($contact['email'] => $contact['firstname'] . ' ' . $contact['lastname']), $subject, $body, null, $subst, null, $wave->getEmailContact());
                     /* email problem */
                 } catch (Swift_RfcComplianceException $e) {
                     // ignore invalid emails
                 }
             }
         }
         $id = $petition_signing->getId();
         $waves_sent = implode(',', $waves_verified);
         $petition_signing->setWaveSent($petition_signing->getWaveCron());
         $petition_signing->setWaveCron(0);
         $petition_signing->save();
         echo "{$i} mails sent. [{$id}:{$waves_sent}] (continue)";
         $con->commit();
     } catch (Exception $e) {
         $con->rollback();
         print $e;
         echo 'exception in transaction. (stop)';
     }
 }
 public function getPending()
 {
     return PetitionSigningTable::getInstance()->query(array_merge($this->getMergedQueryOptions(), array(PetitionSigningTable::STATUS => PetitionSigning::STATUS_PENDING)))->count();
 }
Example #11
0
 public function countSigningsPending()
 {
     return PetitionSigningTable::getInstance()->countPendingByWidget($this);
 }
 protected function doSave($con = null)
 {
     if (null === $con) {
         $con = $this->getConnection();
     }
     $signing = $this->getObject();
     $petition = $signing->getPetition();
     $geo_existing = false;
     if ($petition->isGeoKind()) {
         // EMAIL-TO-LIST ACTION (AND PLEDGE)
         $existing_signing = PetitionSigningTable::getInstance()->findByPetitionIdAndEmail($petition->getId(), $this->getValue('email'));
         if ($existing_signing) {
             $geo_existing = true;
             $existing_signing->setPetition($petition);
             $this->object = $existing_signing;
             $signing = $existing_signing;
             $this->isNew = false;
             $signing->setWavePending($signing->getWavePending() + 1);
         } else {
             $signing->setWavePending(1);
         }
         $this->contact_num = 0;
         if ($petition->getKind() == Petition::KIND_PLEDGE) {
             $targets = ContactTable::getInstance()->fetchIdsByContactIds($petition, $this->getValue('pledges'), $existing_signing);
         } else {
             $targets = ContactTable::getInstance()->fetchIdsByTargetSelector($petition, $this->getValue('ts_1'), $this->getValue('ts_2'), $existing_signing);
         }
         if ($targets) {
             foreach ((array) $targets as $target) {
                 $signing_contact = new PetitionSigningContact();
                 $signing['PetitionSigningContact'][] = $signing_contact;
                 $signing_contact->setContactId($target['id']);
                 $signing_contact->setWave($signing->getWavePending());
                 $this->contact_num++;
             }
             parent::doSave($con);
         } else {
             $this->no_mails = true;
         }
     } else {
         parent::doSave($con);
     }
     $existing_signing = PetitionSigningTable::getInstance()->findByPetitionIdAndEmail($petition->getId(), $signing->getEmail(), $signing->getId());
     if ($existing_signing) {
         if ($existing_signing->getStatus() == PetitionSigning::STATUS_PENDING && !$geo_existing) {
             $existing_signing->delete();
         } else {
             $signing->delete();
             $this->object = $existing_signing;
             $signing = $existing_signing;
             return;
         }
     }
     $validation_kind = $this->getOption('validation_kind', PetitionSigning::VALIDATION_KIND_NONE);
     switch ($validation_kind) {
         case PetitionSigning::VALIDATION_KIND_EMAIL:
             UtilEmailValidation::send($signing);
             break;
         case PetitionSigning::VALIDATION_KIND_NONE:
         default:
             break;
     }
 }
Example #13
0
 public function executeDelete(sfWebRequest $request)
 {
     $id = $request->getParameter('id');
     $signing = PetitionSigningTable::getInstance()->find($id);
     /* @var $signing PetitionSigning */
     if (!$signing) {
         return $this->notFound();
     }
     $user_id = $this->getUser()->getUserId();
     if (!$user_id || $user_id != $signing->getPetition()->getCampaign()->getDataOwnerId()) {
         return $this->notFound();
     }
     $csrf_token = UtilCSRF::gen('delete_signing', $signing->getId(), $user_id);
     if ($request->isMethod('post')) {
         if ($request->getPostParameter('csrf_token') != $csrf_token) {
             return $this->ajax()->alert('CSRF Attack detected, please relogin.', 'Error', '#signing_delete_modal .modal-body')->render();
         }
         $signing->delete();
         return $this->ajax()->remove('#signing_row_' . $id)->modal('#signing_delete_modal', 'hide')->render();
     }
     return $this->ajax()->appendPartial('body', 'delete', array('id' => $id, 'name' => $signing->getComputedName(), 'csrf_token' => $csrf_token))->modal('#signing_delete_modal')->render();
 }
 public function getCount($timeToLive = 600, $refresh = false)
 {
     $count = PetitionSigningTable::getInstance()->countByPetition($this, null, null, $timeToLive, $refresh);
     $count += PetitionApiTokenTable::getInstance()->sumOffsets($this, $timeToLive, $refresh);
     $count += $this->getAddnum();
     return $count;
 }
 protected function execute($arguments = array(), $options = array())
 {
     $context = sfContext::createInstance($this->configuration);
     if ($options['loop']) {
         $max_load = (double) $options['maxload'];
         echo "maxload: {$max_load}\n";
         do {
             $lastline = system('php symfony policat:migrate-json-signings');
             echo PHP_EOL;
             $load = sys_getloadavg();
             $maxwait = 250;
             $waited = 0;
             while ($load[0] > $max_load && $maxwait--) {
                 sleep(1);
                 $waited++;
                 $load = sys_getloadavg();
             }
             if ($waited) {
                 echo "waited {$waited} s\n";
             }
             usleep(500000);
             // 0.5s
         } while (strpos($lastline, 'nothing to do') === false);
     } else {
         // initialize the database connection
         $databaseManager = new sfDatabaseManager($this->configuration);
         $connection = $databaseManager->getDatabase($options['connection'])->getConnection();
         $table = PetitionSigningTable::getInstance();
         $con = $table->getConnection();
         $petition_signings = $table->createQuery('ps')->select('ps.id, ps.fields')->where('ps.fields IS NOT NULL AND ps.fields != ""')->limit(1000)->execute(array(), Doctrine_Core::HYDRATE_ARRAY_SHALLOW);
         $count = count($petition_signings);
         $valid_fields = array('fullname', 'title', 'firstname', 'lastname', 'address', 'city', 'post_code', 'comment', 'privacy', 'email_subject', 'email_body', 'ref');
         if ($count) {
             echo "processing {$count} signings...";
             foreach ($petition_signings as $row) {
                 $fields = json_decode($row['fields'], true);
                 if (!is_array($fields)) {
                     die("invalid json: " . $row['fields']);
                 }
                 $sets = array();
                 $values = array();
                 foreach ($fields as $key => $value) {
                     if (in_array($key, $valid_fields)) {
                         $sets[] = "{$key} = ?";
                         $values[] = $value;
                     } else {
                         if ($key !== 'subscribe') {
                             die("invalid key" . $key . "\n");
                         }
                     }
                 }
                 if (!$sets) {
                     die("no fields\n");
                 }
                 $sets[] = 'fields = ?';
                 $values[] = null;
                 $values[] = $row['id'];
                 $update = 'UPDATE petition_signing SET ' . implode(', ', $sets) . ' WHERE id = ?';
                 //          var_dump(array($update, $values));
                 $con->exec($update, $values);
             }
             echo " done.";
         } else {
             echo "nothing to do.";
         }
     }
 }