public function executeContacts() { $filter_form = new FilterContactForm(); $filter_form->bindSelf('tc' . $this->target_list->getId()); $this->form = $filter_form; $page = isset($this->page) ? $this->page : 1; $contact_table = ContactTable::getInstance(); $this->contacts = new policatPager($filter_form->filter($contact_table->queryByTargetList($this->target_list)), $page, 'target_contact_pager', array('id' => $this->target_list->getId()), true, 20); if (isset($this->last_page) && $this->last_page) { $this->contacts = new policatPager($filter_form->filter($contact_table->queryByTargetList($this->target_list)), $this->contacts->getLastPage(), 'target_contact_pager', array('id' => $this->target_list->getId()), true, 20); } }
public function executeContactDelete(sfWebRequest $request) { $contact = ContactTable::getInstance()->find($request->getParameter('id')); /* @var $contact Contact */ if (!$contact) { return $this->notFound(); } $target_list = $contact->getMailingList(); if (!$this->getGuardUser()->isTargetListMember($target_list, true)) { return $this->noAccess(); } $csrf_token = UtilCSRF::gen('delete_contact', $contact->getId(), $this->getUser()->getUserId()); if ($request->isMethod('post')) { if ($request->getPostParameter('csrf_token') != $csrf_token) { return $this->ajax()->alert('CSRF Attack detected, please relogin.', 'Error', '#contact_delete_modal .modal-body')->render(); } $id = $contact->getId(); $contact->delete(); return $this->ajax()->remove('#contact_' . $id)->modal('#contact_delete_modal', 'hide')->render(); } return $this->ajax()->appendPartial('body', 'delete', array('id' => $contact->getId(), 'name' => $contact->getFullname(), 'csrf_token' => $csrf_token))->modal('#contact_delete_modal')->render(); }
public function getChoices(Petition $petition, $first, $active_pledge_item_ids = false) { $ts = $petition->getTargetSelectors(); $choices = array(); $query = $this->createQuery('ml')->where('ml.id = ?', $petition->getMailingListId()); $fix_field = false; $direct_contact = false; if (count($ts) > 1) { $second = $ts[1]['id']; if (is_numeric($second)) { $query->leftJoin('ml.MailingListMeta mlm2')->andWhere('mlm2.id = ?', $second)->leftJoin('mlm2.MailingListMetaChoice mlmc2')->leftJoin('mlmc2.ContactMeta cm2')->leftJoin('cm2.Contact c')->select('DISTINCT ml.id, mlm2.id, mlmc2.*'); } else { $fix_field = true; $col = $ts[1]['id']; $query->leftJoin('ml.Contact c')->groupBy("c.{$col}")->select("DISTINCT ml.id, c.id, c.{$col}"); } } else { $direct_contact = true; $query->leftJoin('ml.Contact c')->select('DISTINCT ml.id, c.firstname, c.lastname, c.country'); } if (is_numeric($ts[0]['id'])) { $query->leftJoin('c.ContactMeta cm1'); if (array_key_exists('kind', $ts[0]) && $ts[0]['kind'] == MailingListMeta::KIND_MAPPING) { $query->andWhere('cm1.mailing_list_meta_choice_id IN (SELECT mlmc1.id FROM MailingListMetaChoice mlmc1 WHERE mlmc1.mailing_list_meta_id = ? AND mlmc1.choice = ?)', array($ts[0]['meta_id'], $first)); } else { $query->andWhere('cm1.mailing_list_meta_choice_id = ?', $first); } } else { $col = $ts[0]['id']; $query->andWhere("c.{$col} = ?", $first); // should be secure } $list = $query->execute(); $pledges = array(); $infos = array(); $pledge_table = PledgeTable::getInstance(); $pledge_info_columns = $petition->getPledgeInfoColumnsArray(); if ($list) { if ($direct_contact) { foreach ($list[0]['Contact'] as $choice) { /* @var $choice Contact */ $choices[$choice['id']] = $choice['firstname'] . ' ' . $choice['lastname']; } $pledges = $pledge_table->getPledgesForContacts($list[0]['Contact'], $active_pledge_item_ids); $infos = ContactTable::getInstance()->getPledgeInfoColumns($list[0]['Contact'], $pledge_info_columns); } else { if ($fix_field) { $col = $ts[1]['id']; foreach ($list[0]['Contact'] as $choice) { $choices[$choice[$col]] = $choice[$col]; } } else { foreach ($list[0]['MailingListMeta'][0]['MailingListMetaChoice'] as $choice) { $choices[$choice['id']] = $choice['choice']; } } } } return array('choices' => $choices, 'pledges' => $direct_contact && $active_pledge_item_ids !== false ? $pledges : false, 'infos' => $infos); }
function filter(Doctrine_Query $query) { return ContactTable::getInstance()->filter($query, $this); }
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)'; } }
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 executeDownload(sfWebRequest $request) { $petition = PetitionTable::getInstance()->findById($request->getParameter('id'), $this->userIsAdmin()); /* @var $petition Petition */ if (!$petition) { return $this->notFound(); } if (!$petition->isEditableBy($this->getGuardUser())) { return $this->noAccess(); } if ($petition->getKind() != Petition::KIND_PLEDGE) { return $this->noAccess(); } $target_list = $petition->getMailingList(); if (!$target_list) { return $this->notFound(); } $contact_data = ContactTable::getInstance()->queryFullData($target_list, $petition)->execute(array(), Doctrine_Core::HYDRATE_ARRAY); $pledge_data = ContactTable::getInstance()->queryByMailingList($target_list, $petition)->execute(array(), Doctrine_Core::HYDRATE_ARRAY); $pledge_data_contacts = PetitionContactTable::getInstance()->queryByPetition($petition->getId())->execute(array(), Doctrine_Core::HYDRATE_ARRAY); $mailing_list_meta = $target_list->getMailingListMeta(); $pledge_items = $petition->getPledgeItems(); $head = array('email', 'gender', 'first name', 'last name', 'country', 'language'); foreach ($mailing_list_meta as $mlm) { /* @var $mlm MailingListMeta */ if ($mlm->getKind() != MailingListMeta::KIND_MAPPING) { $head[] = $mlm->getName(); } } foreach ($pledge_items as $pledge_item) { /* @var $pledge_item PledgeItem */ $head[] = $pledge_item->getName(); $head[] = 'pledge date'; } $head[] = 'comment'; $out = fopen('php://temp/export', 'a+'); foreach ($contact_data as $id => $contact) { $pledges = array_key_exists($id, $pledge_data) ? $pledge_data[$id]['Pledges'] : array(); $data = array($contact['email'], array_key_exists($contact['gender'], Contact::$GENDER_SHOW) ? Contact::$GENDER_SHOW[$contact['gender']] : null, $contact['firstname'], $contact['lastname'], $contact['country'], $contact['language_id']); $contact_metas = array(); foreach ($contact['ContactMeta'] as $cm) { $cm_id = $cm['mailing_list_meta_id']; if (!array_key_exists($cm_id, $contact_metas)) { $contact_metas[$cm_id] = array(); } if ($cm['MailingListMetaChoice']) { $contact_metas[$cm_id][] = $cm['MailingListMetaChoice']['choice']; } else { $contact_metas[$cm_id][] = $cm['value']; } } foreach ($mailing_list_meta as $mlm) { /* @var $mlm MailingListMeta */ if ($mlm->getKind() != MailingListMeta::KIND_MAPPING) { $data[] = array_key_exists($mlm->getId(), $contact_metas) ? implode('|', $contact_metas[$mlm->getId()]) : ''; } } foreach ($pledge_items as $pledge_item) { /* @var $pledge_item PledgeItem */ $pledge_status = array_key_exists($pledge_item->getId(), $pledges) ? $pledges[$pledge_item->getId()]['status'] : null; $data[] = array_key_exists($pledge_status, PledgeTable::$STATUS_SHOW) ? PledgeTable::$STATUS_SHOW[$pledge_status] : null; $data[] = array_key_exists($pledge_item->getId(), $pledges) ? $pledges[$pledge_item->getId()]['status_at'] : null; } $data[] = array_key_exists($id, $pledge_data_contacts) ? $pledge_data_contacts[$id]['comment'] : null; fputcsv($out, $data, ';'); } header('Content-Description: File Transfer'); header('Content-Type: application/csv'); header('Content-Type: text/plain'); header('Content-Disposition: attachment; filename=' . '"pledges.csv"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); ob_clean(); flush(); $stdout = fopen('php://output', 'w'); fwrite($stdout, ""); fputcsv($stdout, $head, ';'); fclose($stdout); rewind($out); fpassthru($out); fclose($out); exit; }
public function getTargetSelectorChoices2($first, $second) { $tagging_cache = sfCacheTaggingToolkit::getTaggingCache(); $cache_key = 'Petition_TS2_' . $this->getId() . '_' . (is_scalar($first) && is_scalar($second) ? $first . '__' . $second : md5(json_encode(array($first, $second)))); $cached_ret = $tagging_cache->get($cache_key, null); if ($cached_ret !== null) { return $cached_ret; } $contacts = ContactTable::getInstance()->queryByTargetSelector($this, $first, $second)->execute(); $pledge_table = PledgeTable::getInstance(); $choices = array(); $active_pledge_item_ids = $this->getActivePledgeItemIds(); $pledge_info_columns = $this->getPledgeInfoColumnsArray(); $pledges = $pledge_table->getPledgesForContacts($contacts, $active_pledge_item_ids); $infos = ContactTable::getInstance()->getPledgeInfoColumns($contacts, $pledge_info_columns); foreach ($contacts as $contact) { /* @var $contact Contact */ $choices[$contact['id']] = $contact['firstname'] . ' ' . $contact['lastname']; } $ret = array('choices' => $choices, 'pledges' => $pledges, 'infos' => $infos); $tags = $this->getCacheTags(); if ($this->getMailingListId()) { $tags = array_merge($tags, $this->getMailingList()->getCacheTags()); } $tagging_cache->set($cache_key, $ret, 24 * 3600, $tags); return $ret; }