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(); }
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; } }
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."; } } }