Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add email notifications for tasks and challenges #148

Open
wants to merge 9 commits into
base: master
Choose a base branch
from

Conversation

georgyangelov
Copy link
Collaborator

PR към #140

Очаквам коментари :)

@coveralls
Copy link

Coverage Status

Coverage decreased (-4.08%) when pulling 20a284f on stormbreakerbg:email-notifications into 7d36321 on skanev:master.

@coveralls
Copy link

Coverage Status

Coverage increased (+0.0%) when pulling 20a284f on stormbreakerbg:email-notifications into 7d36321 on skanev:master.

@user_name = user.first_name
@challenge_name = challenge.name
@challenge_url = challenge_url(challenge)
@challenge_end_date = challenge.closes_at.strftime('%d.%m.%Y %H:%M')
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тоя формат не може ли да отиде в рейлската конфигурация? Отделно, нямаме ли някъде остандартен формат на дати?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не намерих глобален формат. Което не значи, че няма...

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Друг проект е било. Играта ти е нещо в config/initializers.

Малко вдъхновение

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Има вградени формати на дати в Рейлс. Не помя точните имена, но имаше
:short, :long и подобни, ако не се лъжа. И май се подаваха като аргумент на
:to_s.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mitio Like, read the link, bro.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mitio не ми харесаха форматите, затова реших да си го форматирам ръчно :)

EDIT: Имало е default формат в locales

@skanev
Copy link
Owner

skanev commented Sep 23, 2014

Много яко, но има повторение.

  • Mailer-ите са почти еднакви. Observer-ите също.
  • Тестовете плачат за shared_examples_for

Отделно:

Не мога да напипам кога пращаш mail-и. Правиш някаква хакерия с hidden_changed?, която не ми се струва добра идея, понеже:

  1. Някой може да пусне предизвикателство без да иска и да го върне обратно, резултиращо в два мейла; и
  2. една идея по-магическо, отколкото трябва.

Щях да ти предложа да пазиш състояние във всяко такова дали студентите са били известени, но вместо това ти предлагам да сложиш един бутон "Изпрати известие за ново предизвикателство" за админите и да разкараш тези observer-и.

@georgyangelov
Copy link
Collaborator Author

Благодаря за коментарите. :)

За повторението доста се чудих какво да направя, понеже не съм особено запознат с Rails и не ми е много ясно кое къде е добре да се сложи. Общ mailer, който да се използва за повече от един модел ОК ли е? Повечето повторения идват от факта, че самите модели challenge и task са доста подобни.
Не знаех за shared_examples_for.

Това с бутона е добро, ще го преработя утре.

@skanev
Copy link
Owner

skanev commented Sep 23, 2014

Общ мейлър е ОК. Търсиш някакъв протокол (интерфейс) на който Challenge и Task да отговорят и правиш всичко да работи по него.

Мога да ти помогна с дизайна, но няма да е тази седмица. Евентуално следващата. Отвъд това, напълно ОК съм да ревюирам каквото изпратиш :)

@coveralls
Copy link

Coverage Status

Coverage increased (+0.0%) when pulling 2f4a97c on stormbreakerbg:email-notifications into 7d36321 on skanev:master.

@coveralls
Copy link

Coverage Status

Coverage increased (+0.0%) when pulling 9183dfa on stormbreakerbg:email-notifications into 7d36321 on skanev:master.

@georgyangelov
Copy link
Collaborator Author

Преработих нещата:

  • Използвам формата на датата от config/locales/bg.yml. Тук в тестовете използвам I18n.l, което зависи от конфигурацията и малко ме притеснява. Има ли по-добър начин или така става?
  • Махнах observer-ите и сложих бутони.
  • Промених тестовете на mailer-ите и използвам shared_examples_for.

Не съм напълно убеден, че общ mailer е много добра идея в конкретния случай. Кодът не е много, а с изключение на challenge и task няма да може работи в този вид за друг модел. Освен това, ако трябва да се параметризира или да се изнесат на друго място специфичните неща, няма ли да се обезсмисли идеята на mailer-ите?


def new_challenge
challenge = Challenge.find params[:id]
ChallengeMailer.new_challenge challenge unless challenge.hidden
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

challenges.hidden е булева колонка, което означава, че можеш да я достъпваш и като предикат през модела, което аз бих предпочел в този случай: ... unless challenge.hidden?.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. :)

@coveralls
Copy link

Coverage Status

Coverage increased (+0.0%) when pulling fdbcdea on stormbreakerbg:email-notifications into 7d36321 on skanev:master.

The shared examples in their previous form could not be used for
any other mailer, even though there may be other mailers that send
emails to multiple users. Also, the parametrization of the shared
examples makes it harder to follow the expectations of the tests.

Now, only the examples for the `#new_challenge` and `#new_task` methods
are shared. This will make the shared test usable for other mailers.
The other option is to make another mailer whose job is to retrieve
all users from the database and call another mailer, but the method
itself is small and making it more generic will be almost like
recreating the functionality of `User.where.each`.

The expectations in the separate mailer spec files are similar, but
for other similar mailers they may be different. For example an
announcement mailer would not contain the title of the announcement
in the body text (only in the subject) and would not use
`announcement_url(announcement)` to generate its URL.
@coveralls
Copy link

Coverage Status

Coverage increased (+0.0%) when pulling 259bd04 on stormbreakerbg:email-notifications into 7d36321 on skanev:master.

@georgyangelov
Copy link
Collaborator Author

Направих някои промени по тестовете - изкарах тези за #new_#{model}_for_user от shared_examples. Така ми се струва по-преизползваемо и по-просто. Аргументация има в съобщението на commit-a. :)

Имейлите за новини мисля да ги базирам на този бранч. Да пусна ли друг PR за тях или да изчакам да ревюирате този, и тогава?

ПП. Не бързам, просто се чудех дали не е добре да изчакам с другия PR. :)

@challenge_end_date = challenge.closes_at

mail to: user.email,
subject: "Ново предизвикателство - #{challenge.name}"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Това мисля, че ще се събере на един ред. Мисля, че беше коментирано, че тази подредба не се тачи в този codebase :)

@@ -9,6 +9,13 @@
= admin_only do
- unless ChallengeCheckWorker.queued? @challenge.id
= link_to 'Пусни тестовете', challenge_check_path(@challenge), method: :create, class: :action
= admin_only do
- unless @challenge.hidden
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@challenge.hidden? (т.е. сложи въпросителна на hidden).

@mitio
Copy link
Collaborator

mitio commented Nov 9, 2014

@stormbreakerbg, относно последния ти коментар, мисля, че това е добър пример за спекулативен дизайн – правиш си дизайна така, че да адресира евентуално бъдещо разширение (announcements mailer). Но това, колкото и сигурно да изглежда, е все още в неясен бъдещ момент.

В коментара на commit-съобщението, за който споменаваш, се говори за разлики в announcements mailer-а – че няма да съдържат заглавието на новината в body-текста (защо?) и че няма да ползват announcements_path. След 431633d последното вече не е необходимо.

Та, ето я реалността. Промените, които си направил, са на база на спекулация за евентуални бъдещи необходимости, които вече не съществуват.

Относно повтарянето на нещата – наистина са доста близки. Не мислиш ли, че ще е по-добре да обединим повторенията в "homework" и да кръстим нещата EmailNotifications.new_homework..., new_homework_for_user и прочее, като запазим разликите в текстовете и двете отделни опции? За целта ще трябва да параметризираме homework_type (:task, :challenge) и translated_homework_type (примерно) на "нова задача"/"ново предизвикателство". Май ще са само това разликите. Дай мнение когато можеш.

@georgyangelov
Copy link
Collaborator Author

@mitio, честно казано, ако се бях сетил за EmailNotifications#new_homework_for_user нямаше да го направя така. :)

И все пак, обединението в homework силно се възползва от това, че имейлите са много близки по съдържание, което в този случай е напълно оправдано, но според мен по принцип е доста близо до границата с "DRY на всяка цена".

На мейлърите гледам като на конфигурация. Да, ще се случи два да имат подобен формат или да работят по подобен начин - например и двете да пращат до всички потребители, които са се абонирали, или в даден момент ще изглеждат по подобен начин. Но обединението на announcements и homeworks ще стане "насила". Споменавам го тук, но наистина тази част от коментара принадлежи на PR-а за имейлите за новините.

Наистина, ако го нямаше този общ знаменател (homework), според мен не би било оправдано да се опитваме "насила" да премахнем малко дублиране, което е само на ниво код. Да, методите new_task и new_challenge са много подобни (new_homework_for_user и new_announcement_for_user като по-добър пример), но дали си заслужава да усложняваме нещата, като параметризираме почти всичко в тези два реда код?

За новините - смятам, че няма нужда да съдържат заглавието и в body-то, защото така се доближаваме по-добре до семантиката на имейлите. Лично аз бих предпочел по-скоро да нагодим кода към имейла, отколкото обратното.

Да обобщя - харесва ми идеята за new_homework. Последният ми commit целеше да елиминира напълно "механичното" премахване на дублирания в тестовете (големият параметризиран shared_examples_for), което симулираше copy/paste на тестове, с нещо по-добре вписващо се логически. new_homework ще направи това добре за задачите и предизвикателствата.

Донякъде съм съгласен със забележката за спекулативния дизайн. Може би в случая не се получи добре, но целта ми беше и да махна големия shared_examples_for. Не съм напълно съгласен, че не трябва да мислим и за разширението, и различните use case-ове, които могат да произлязат от написването на един код. Все пак възможността за по-лесно разширение е едно от нещата, което определя добрия код. Това е, разбира се, при условие, че не се вдига сложността за сметка на нещо, което ще се появи в бъдещето. Разделянето на тестовете и позволяването на различаващ се формат на имейлите според мен не вдига сложността и не изисква много усилие за написване. Отново, ако се бях сетил за логическото групиране в new_homework нямаше да подходя така. :)

@mitio
Copy link
Collaborator

mitio commented Nov 9, 2014

Макар че ми е трудно да го рационализирам, в този конкретен случай аз бих обединил функционалността за известие на задачи и предизвикателства под знаменател "homework", бих параметризирал само типовете и превода на нещото (а преводът даже може да се извлича автоматично от locale файла на база на типа).

Това за новините бих го оставил отделно.

Иначе съм съгласен, че е малко на границата на насилствения DRY. В крайна сметка, нямам силни възражения да остане и така. Бих оставил на теб да прецениш.

Като горигираш нещата, остави един коментар да погледна пак и да го merge-нем :)

@georgyangelov
Copy link
Collaborator Author

Да, със сигурност тези двете ще ги обединя. homework е добър общ знаменател за задача и предизвикателство. За насилствения DRY говорех за новините и малко "по принцип" (ако не беше измислил homework), не конкретно за homework. :)

Ще ги коригирам. Няма да е днес, обаче.

@georgyangelov
Copy link
Collaborator Author

@mitio оправих част от нещата. При обединяването на мейлърите възникна следният проблем, който не знам как най-добре да реша - не е достатъчно просто да сменим думата "задача" с "предизвикателство", защото са в различен род:

Нова задача <> Ново предизвикателство
Публикувано е ново предизвикателство <> Публикувана е нова задача

Дали двете да ги сложа в locale файла или само заглавието на имейла, а за другото да са отделни view-тата за съдържанието на имейла?

@coveralls
Copy link

Coverage Status

Coverage increased (+0.0%) when pulling 1329330 on stormbreakerbg:email-notifications into 7d36321 on skanev:master.

@sgatev
Copy link
Collaborator

sgatev commented Mar 28, 2015

Как стоят нещата тук?

@mitio
Copy link
Collaborator

mitio commented Mar 29, 2015

Все още го искаме, но не е прегледан. Би трябвало да не е много трудно да се merge-не.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants