From 84906324523f486ee6f6280606ab2b4505ee13dc Mon Sep 17 00:00:00 2001 From: Nicolas Bally Date: Thu, 30 Oct 2014 19:09:42 +0100 Subject: [PATCH] mail tracking --- .../admin/mail_trackings_controller.rb | 18 ++++++++++ .../admin/newsletters_controller.rb | 31 ++++++++++++++---- app/models/archive_newsletter.rb | 3 ++ app/models/mail_archive.rb | 17 ++++++++++ .../newsletter_mails/newsletter.html.haml | 3 +- config/routes.rb | 2 +- .../20141030163836_create_mail_archives.rb | 15 +++++++++ ...141030173048_create_archive_newsletters.rb | 12 +++++++ db/schema.rb | 30 ++++++++++++++++- public/tracking.png | Bin 0 -> 17814 bytes test/fixtures/archive_newsletters.yml | 13 ++++++++ test/fixtures/mail_archives.yml | 17 ++++++++++ test/models/archive_newsletter_test.rb | 7 ++++ test/models/mail_archive_test.rb | 7 ++++ 14 files changed, 166 insertions(+), 9 deletions(-) create mode 100644 app/controllers/admin/mail_trackings_controller.rb create mode 100644 app/models/archive_newsletter.rb create mode 100644 app/models/mail_archive.rb create mode 100644 db/migrate/20141030163836_create_mail_archives.rb create mode 100644 db/migrate/20141030173048_create_archive_newsletters.rb create mode 100644 public/tracking.png create mode 100644 test/fixtures/archive_newsletters.yml create mode 100644 test/fixtures/mail_archives.yml create mode 100644 test/models/archive_newsletter_test.rb create mode 100644 test/models/mail_archive_test.rb diff --git a/app/controllers/admin/mail_trackings_controller.rb b/app/controllers/admin/mail_trackings_controller.rb new file mode 100644 index 0000000..6762289 --- /dev/null +++ b/app/controllers/admin/mail_trackings_controller.rb @@ -0,0 +1,18 @@ +# -*- encoding : utf-8 -*- + + +class Admin::MailTrackingsController < ApplicationController + # GET /people + # GET /people.xml + + def update + @mail_archive = MailArchive.find_by_token(params[:token]) + @mail_archive.update_attributes(:readed => true) + + send_file 'public/tracking.png', type: 'image/png', disposition: 'inline' + + + end + + +end diff --git a/app/controllers/admin/newsletters_controller.rb b/app/controllers/admin/newsletters_controller.rb index d1070c2..e4d61a8 100755 --- a/app/controllers/admin/newsletters_controller.rb +++ b/app/controllers/admin/newsletters_controller.rb @@ -76,8 +76,8 @@ class Admin::NewslettersController < ApplicationController def send_test @newsletter = Newsletter.find(params[:id]) - NewsletterMails.newsletter(@newsletter, params[:email]).deliver - + #NewsletterMails.newsletter(@newsletter, params[:email]).deliver + send_helper @newsletter, params[:email] flash[:notice]= "La newsletter a bien été envoyée à l'email de test" @@ -86,10 +86,27 @@ class Admin::NewslettersController < ApplicationController def send_helper(newsletter, email, options = {}) - begin - NewsletterMails.newsletter(newsletter, email, options).deliver if email and email != "" - rescue - @errors << "#{p.email}" + + if email and email != "" + + begin + @mail_archive = MailArchive.new + @mail_archive.archive_newsletter_id = @archive_newsletter.id if @archive_newsletter + @mail_archive.email = email + @mail_archive.newsletter_id = newsletter.id + @mail_archive.sheet = options[:sheet] + @mail_archive.person = options[:person] + @mail_archive.save + + options = options.merge({:mail_archive => @mail_archive}) + + + NewsletterMails.newsletter(newsletter, email, options).deliver if email and email != "" + + + rescue + @errors << "#{email}" + end end end @@ -97,6 +114,8 @@ class Admin::NewslettersController < ApplicationController def send_newsletter @errors = [] @newsletter = Newsletter.find(params[:id]) + + @archive_newsletter = ArchiveNewsletter.create :newsletter_id => @newsletter.id, :title => @newsletter.title, :content => @newsletter.content, :email_from => Newsletter::EMAIL_TEXTES[@newsletter.email_from][0].to_s+ " <#{@newsletter.email_from}>" if params[:confirmed_groups] PeopleNewsgroup.all(:conditions => {:newsgroup_id => params[:confirmed_groups]}).each do |pn| if pn.person diff --git a/app/models/archive_newsletter.rb b/app/models/archive_newsletter.rb new file mode 100644 index 0000000..b9e1a0e --- /dev/null +++ b/app/models/archive_newsletter.rb @@ -0,0 +1,3 @@ +class ArchiveNewsletter < ActiveRecord::Base + belongs_to :newsletter +end diff --git a/app/models/mail_archive.rb b/app/models/mail_archive.rb new file mode 100644 index 0000000..0906cec --- /dev/null +++ b/app/models/mail_archive.rb @@ -0,0 +1,17 @@ +class MailArchive < ActiveRecord::Base + belongs_to :newsletter + belongs_to :archive_newsletter + belongs_to :sheet + belongs_to :person + + before_create do + self.generate_token + end + + def generate_token + begin + self[:token] = SecureRandom.urlsafe_base64 + end while MailArchive.exists?(:token => self[token]) + end + +end diff --git a/app/views/newsletter_mails/newsletter.html.haml b/app/views/newsletter_mails/newsletter.html.haml index 3e0edee..6ea6337 100644 --- a/app/views/newsletter_mails/newsletter.html.haml +++ b/app/views/newsletter_mails/newsletter.html.haml @@ -15,4 +15,5 @@ %br %br =link_to @newsletter.email_from, "mailto:#{@newsletter.email_from}" - \ No newline at end of file +-if @options[:mail_archive] and @options[:mail_archive].token + =image_tag image_tracking_url(:token => @options[:mail_archive].token) \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index cfff28b..4d35906 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,7 +5,7 @@ Survey::Application.routes.draw do get 'plaquettes/gaspillage.:f' => 'plaquettes#gaspillage', :f => "html" get 'plaquettes/:slug.:f' => 'plaquettes#show', :f => "html" - + get 'mail_assets/:token.png' => "admin/mail_trackings#update", :as => :image_tracking #admin diff --git a/db/migrate/20141030163836_create_mail_archives.rb b/db/migrate/20141030163836_create_mail_archives.rb new file mode 100644 index 0000000..82ee3f3 --- /dev/null +++ b/db/migrate/20141030163836_create_mail_archives.rb @@ -0,0 +1,15 @@ +class CreateMailArchives < ActiveRecord::Migration + def change + create_table :mail_archives do |t| + t.references :newsletter, index: true + t.references :archive_newsletter, index: true + t.string :email + t.references :sheet, index: true + t.references :person, index: true + t.string :token + t.boolean :readed + + t.timestamps + end + end +end diff --git a/db/migrate/20141030173048_create_archive_newsletters.rb b/db/migrate/20141030173048_create_archive_newsletters.rb new file mode 100644 index 0000000..8f37b24 --- /dev/null +++ b/db/migrate/20141030173048_create_archive_newsletters.rb @@ -0,0 +1,12 @@ +class CreateArchiveNewsletters < ActiveRecord::Migration + def change + create_table :archive_newsletters do |t| + t.references :newsletter, index: true + t.string :title + t.text :content + t.string :email_from + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index d6b6b7a..3d1d9e7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140619095558) do +ActiveRecord::Schema.define(version: 20141030173048) do create_table "admins", force: true do |t| t.string "email", default: "", null: false @@ -48,6 +48,17 @@ ActiveRecord::Schema.define(version: 20140619095558) do add_index "answer_sets", ["question_set_id"], name: "index_answer_sets_on_question_set_id", using: :btree add_index "answer_sets", ["survey_item_answer_id"], name: "index_answer_sets_on_survey_item_answer_id", using: :btree + create_table "archive_newsletters", force: true do |t| + t.integer "newsletter_id" + t.string "title" + t.text "content" + t.string "email_from" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "archive_newsletters", ["newsletter_id"], name: "index_archive_newsletters_on_newsletter_id", using: :btree + create_table "donates", force: true do |t| t.date "paid_at" t.integer "amount" @@ -141,6 +152,23 @@ ActiveRecord::Schema.define(version: 20140619095558) do t.datetime "updated_at", null: false end + create_table "mail_archives", force: true do |t| + t.integer "newsletter_id" + t.integer "archive_newsletter_id" + t.string "email" + t.integer "sheet_id" + t.integer "person_id" + t.string "token" + t.boolean "readed" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "mail_archives", ["archive_newsletter_id"], name: "index_mail_archives_on_archive_newsletter_id", using: :btree + add_index "mail_archives", ["newsletter_id"], name: "index_mail_archives_on_newsletter_id", using: :btree + add_index "mail_archives", ["person_id"], name: "index_mail_archives_on_person_id", using: :btree + add_index "mail_archives", ["sheet_id"], name: "index_mail_archives_on_sheet_id", using: :btree + create_table "newsgroups", force: true do |t| t.string "name" t.text "description" diff --git a/public/tracking.png b/public/tracking.png new file mode 100644 index 0000000000000000000000000000000000000000..487dd302bcd8cc21128c5b75ca338b2718d318ab GIT binary patch literal 17814 zcmeI3c{r5o|HmK6l2R&dB4cY~%wh&Jn8+y0u||wIHJi*aW~NyfN(zPK$Vpj>_9&Go zEgVZBEtW(IsdGr1t+J=`dxkdsKr*%Urx1RAF@YCQLQ(RWF!+KX1$U5ztX}Efd z4J=|`SeQ4->qah2GmLKGZm#S#9cEY>w#(|`fDB2wPLRFHvTggOX#-EM50s={@2*H5 zsx;^x!BvkOM$7^PQCjg)PJ$iGY%i6$D#f<84&>QK02z$=yeRWF4t>tZt5?>8)#1Rl zYtr&SvHgZWiJD;}{utqFv_3FL5nz}uGFlAaWOwj+IxaY1y*#iqrfm**AP3A~xNsGK z00m&-$7x+sz?#OXBT`_a*KaVOf7%XW8|UOUVC77}Bgm^zb;lnHKtCnTX@+^MG@yQA zM~U>&gHpwNJ33UC0J&;_UhU^Qkt2vShOOhw$gJnl`5?#@*30)t84tZ3Nn^%S-mBdL z%;#B`P=I1p;LN?d(M~zW{tk88(}RHhdQK5#j%fG!N$5MK4o;=ox;ZVMmL+SY;&l@) zwJs&4%stWTm?%@e@>6X?{M{MHakf=TyDu)gZmyJQd?)B;1a80Hy*;r>jniD;xLEB) z^LAs1LFLQ_S3~{HE5p5%78o9Y+a&KyT%vrguI%02kZ4o$*DGdQ=?>Id9kca5xFFM1 zH}TerzTX^#y$Oz&-w&Is%9~43{;|MYYbbKfr*b!0D9KyM&QX$*doT6;wcT?7*opgV z+nIfceV0D!%yGuYz+W_0Zo)O17)xvGq+eXReaK`f4A_Cpa$sEV1eTNm@}ah^Nx)&D ztoaD?RPx_4M_IDQ%_VNuJxejF0I+2FQP~;yrKFKkb{A#Va%2#1!#BxCE{_VQdB}Sy znHyS@QF`GIou=wsTy(`kr(s z_h+k>DxoZyN^48i-dTjjTWibOtZ|u5&|IT@8%=||ge7Pmu*SN?ecW@{yh_7;-|x=} z58`HMvEvcTce^;to{dX6Vc;BCrygtGdS7O_dZpF$`>Xj{o;&N0%GLPvss<|-#P%OU z)Hu&T&f6Qkh~YAK5ZhRjvGHL(AVB z@-?CAg2b2&JDYZ7mOlJ9Wy=DN(UwowWg1iH1t35{$Wk_UGl;bTE=Eg*s zM9D>Ojy8%4FLl(O_m{?)@>)HPa2$DeDdWpFnmxCNp4&eU zd2aY#@E#Vl_qav&QQ^9l<;e*T6BKN<+BDl{x25jcvnP8``vSAdQ^DS$$vQJVHQnr3h|8(W#xpr?L1%T{ zGF=b3u`>$SYh@;%8Onsa>N@GVo16{s?mU1eHG7#krJg8UU10ku;)8devtr)v@HGi* zuH2H1l~!@b?8Zc=yhyo`Vp_SnvLNLpR_@ip=7=TMFCRR5Fi?YdAh&4hZkh1P+q4Aa zOjO+63bcpdv@@vF!;cD;eGjywvb7h~QU+{P?7Fs34z)<(T3WtD@A(y-fZ zJfI9+BA!#Im#L46PjgO+znRgP(d1k4_@?nwVeFRu@2GS4MCaS=wn?^$yc2ci*lT7j z{j}ogSrxZ^x_qWw>hwwVQLlto%&mNsd^Kqn$#=s=xPqRF-V)LSy%0DL?x)8l%|7?! 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