コード例 #1
0
        public ActionResult BulkRequestValuation(BulkRequestValuationViewModel model)
        {
            if (model.File == null)
            {
                return(View(model));
            }

            try
            {
                var invited          = 0;
                var notInvited       = new List <NotInvitedViewModel>();
                var errorWhenInvited = new List <ErrorInvitedViewModel>();

                var data = _bulkImporter.Execute(model.File.InputStream);

                Logger.Info("Sending bulk validation requests...");

                var emails = (from a in data
                              where !string.IsNullOrWhiteSpace(a.ISSN) && !string.IsNullOrWhiteSpace(a.AuthorEmail) && EmailValidator.IsValid(a.AuthorEmail)
                              let journal = journalRepository.FindByIssn(a.ISSN)
                                            where journal != null
                                            select new RequestValuationViewModel
                {
                    JournalId = journal.Id,
                    JournalTitle = journal.Title,
                    JournalISSN = journal.ISSN,
                    EmailFrom = "*****@*****.**",
                    EmailTo = a.AuthorEmail,
                    RecipientName = a.AuthorName,
                    EmailBody = $"Dear {a.AuthorName},\r\n\r\n{model.EmailBody.Replace("<<JournalTitle>>", journal.Title)}\r\n\r\n-----------\r\n\r\nYou are being invited by: {model.EmailFrom}",
                    EmailSubject = model.EmailSubject.Replace("<<JournalTitle>>", journal.Title).Replace("<<JournalISSN>>", journal.ISSN),
                    IsKnownEmailAddress = IsKnownEmailAddress(a.AuthorEmail),
                    HasKnownEmailDomain = HasKnownEmailDomain(a.AuthorEmail)
                }).ToList();

                foreach (var item in emails.Select(e => new { Email = e.ToRequestValuationEmail(), Model = e }))
                {
                    // NOTE: Requirements have changed. Leo Waaijers requested that e-mail addresses with unknown domains could be invited to fill in a Score Card - Sergi Papaseit (2015-12-10)
                    try
                    {
                        item.Email.Url = FillEmailUrl(item.Model);
                        item.Email.Send();

                        Logger.Info($"Sent validation request to {item.Email.To}.");

                        invited++;
                    }
                    catch (Exception ex)
                    {
                        Logger.Error($"Error sending validation request to {item.Email.To}: {ex}.", ex);

                        errorWhenInvited.Add(new ErrorInvitedViewModel
                        {
                            ISSN        = string.IsNullOrWhiteSpace(item.Model.JournalISSN) ? "Unknown" : item.Model.JournalISSN,
                            AuthorName  = item.Model.RecipientName,
                            AuthorEmail = string.IsNullOrWhiteSpace(item.Model.EmailTo) ? "Unknown" : item.Model.EmailTo
                        });
                    }
                }

                notInvited.AddRange(
                    from a in data
                    where string.IsNullOrWhiteSpace(a.ISSN) || string.IsNullOrWhiteSpace(a.AuthorEmail) || !EmailValidator.IsValid(a.AuthorEmail)
                    select new NotInvitedViewModel
                {
                    ISSN        = string.IsNullOrWhiteSpace(a.ISSN) ? "Unknown" : a.ISSN,
                    AuthorName  = a.AuthorName,
                    AuthorEmail = string.IsNullOrWhiteSpace(a.AuthorEmail) ? "Unknown" : a.AuthorEmail + " (invalid)"
                });

                foreach (var notInvitedViewModel in notInvited)
                {
                    Logger.Info($"Skipped sending validation request to {notInvitedViewModel.AuthorEmail}.");
                }

                return(View("BulkInviteSuccessful", new AuthorsInvitedViewModel
                {
                    AmountInvited = invited,
                    AuthorsNotInvited = notInvited,
                    AuthorsInvitedWithError = errorWhenInvited
                }));
            }
            catch (ArgumentException invalidFileException)
            {
                ModelState.AddModelError("generalError", invalidFileException.Message);
            }
            catch (DbEntityValidationException)
            {
                //foreach (var eve in e.EntityValidationErrors)
                //{
                //    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",eve.Entry.Entity.GetType().Name, eve.Entry.State);
                //    foreach (var ve in eve.ValidationErrors)
                //    {
                //        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage);
                //    }
                //}
                //throw;
            }
            catch (FormatException fe)
            {
                ModelState.AddModelError("generalError", $"An error has ocurred: {fe.Message}");
            }
            catch (Exception exception)
            {
                ModelState.AddModelError("generalError", $"An error has ocurred: {exception.InnermostMessage()}");
            }

            return(View(model));
        }
コード例 #2
0
        public ActionResult ImportSubmissionLinks(ImportSubmissionLinksViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            try
            {
                int imported = 0, rejected = 0;
                var rejectedUrls = new List <SubmissionPageLink>();

                var data = _bulkImporter.Execute(model.File.InputStream);

                foreach (var submissionPageLink in data)
                {
                    var journal = journalRepository.FindByIssn(submissionPageLink.ISSN);

                    if (journal == null || !DomainMatches(journal.Link, submissionPageLink.Url))
                    {
                        rejected++;

                        rejectedUrls.Add(submissionPageLink);
                        continue;
                    }

                    journal.SubmissionPageLink = submissionPageLink.Url;
                    imported++;
                }

                journalRepository.Save();

                return(View("SubmissionLinksImportSuccessful", new SubmissionLinksImportedViewModel
                {
                    AmountImported = imported,
                    AmountRejected = rejected,
                    RejectedUrls = rejectedUrls
                }));
            }
            catch (ArgumentException invalidFileException)
            {
                ModelState.AddModelError("generalError", invalidFileException.Message);
            }
            catch (DbEntityValidationException)
            {
                //foreach (var eve in e.EntityValidationErrors)
                //{
                //    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",eve.Entry.Entity.GetType().Name, eve.Entry.State);
                //    foreach (var ve in eve.ValidationErrors)
                //    {
                //        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage);
                //    }
                //}
                //throw;
            }
            catch (Exception exception)
            {
                while (exception.InnerException != null)
                {
                    exception = exception.InnerException;
                }

                ModelState.AddModelError("generalError", $"An error has ocurred: {exception.Message}");
            }

            return(View(model));
        }
コード例 #3
0
ファイル: JournalsController.cs プロジェクト: spapaseit/qoam
        public ActionResult BulkImportInstitutionalPrices(InstitutionalPricesViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            try
            {
                int imported = 0, deleted = 0, updated = 0;

                var data = _bulkImporter.Execute(model.File.InputStream);

                var institutionJournals = (from u in data
                                           let institution = institutionRepository.Find(u.Domain)
                                                             where institution != null
                                                             from info in u.Licenses
                                                             let journal = journalRepository.FindByIssn(info.ISSN)
                                                                           where journal != null
                                                                           select new InstitutionJournal
                {
                    DateAdded = DateTime.Now,
                    Link = info.Text,
                    JournalId = journal.Id,
                    UserProfileId = Authentication.CurrentUserId,
                    InstitutionId = institution.Id
                }).ToList();

                // This is gonna be quite an expensive operation... Rethink!
                foreach (var institutionJournal in institutionJournals.Distinct())
                {
                    var existing = institutionJournalRepository.Find(institutionJournal.JournalId, institutionJournal.InstitutionId);

                    if (existing != null)
                    {
                        if (string.IsNullOrWhiteSpace(institutionJournal.Link))
                        {
                            institutionJournalRepository.Delete(existing);
                            deleted++;
                        }
                        else
                        {
                            existing.DateAdded     = DateTime.Now;
                            existing.Link          = institutionJournal.Link;
                            existing.UserProfileId = institutionJournal.UserProfileId;

                            institutionJournalRepository.InsertOrUpdate(existing);

                            updated++;
                        }
                    }
                    else if (!string.IsNullOrWhiteSpace(institutionJournal.Link))
                    {
                        institutionJournalRepository.InsertOrUpdate(institutionJournal);
                        imported++;
                    }
                }

                institutionJournalRepository.Save();

                return(RedirectToAction("BulkImportSuccessful", new { amountImported = imported, amountDeleted = deleted, amountUpdated = updated }));
            }
            catch (ArgumentException invalidFileException)
            {
                ModelState.AddModelError("generalError", invalidFileException.Message);
            }
            catch (DbEntityValidationException)
            {
                //foreach (var eve in e.EntityValidationErrors)
                //{
                //    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",eve.Entry.Entity.GetType().Name, eve.Entry.State);
                //    foreach (var ve in eve.ValidationErrors)
                //    {
                //        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage);
                //    }
                //}
                //throw;
            }
            catch (Exception exception)
            {
                while (exception.InnerException != null)
                {
                    exception = exception.InnerException;
                }

                ModelState.AddModelError("generalError", $"An error has ocurred: {exception.Message}");
            }

            return(View(model));
        }