private List <ThumbnailModel> GetSiteYearSummary(long siteID) { List <ThumbnailModel> Years = new List <ThumbnailModel>(); string siteName = CollectionRepository.Find(c => c.Site.ID == siteID).FirstOrDefault().Site.Name; List <int> yearStrings = PhotoRepository.Find(p => p.Site.ID == siteID).Select(p => p.Captured.Year).Distinct().ToList <int>(); foreach (int y in yearStrings) { ThumbnailModel model = new ThumbnailModel(); model.Name = Convert.ToString(y); Photo[] photos = PhotoRepository.Find(p => p.Site.ID == siteID && p.Captured.Year == y) .ToArray(); model.PhotoCount = photos.Count(); model.First = photos[0].Captured; model.Last = photos[photos.Count() - 1].Captured; photos = photos.Where(p => p.Captured.Hour > 12 && p.Captured.Hour < 16).ToArray(); Random rand = new Random(); model.CoverPhotoID = photos[rand.Next(photos.Length)].ID; model.Link = "/Search/Index?site=" + siteName + "&year=" + model.Name; Years.Add(model); } return(Years); }
public void NewUserCollection(User user, string collectionName, string photoIds) { List <Photo> photos; long[] ids; if (!String.IsNullOrWhiteSpace(photoIds)) { ids = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray(); photos = PhotoRepository.Find(p => ids.Contains(p.ID), p => p.Site).ToList(); } else { ids = new long[0]; photos = new List <Photo>(); } Guid containerID = Guid.NewGuid(); //save the collection Collection c = new Collection() { Name = collectionName, ContainerID = containerID.ToString(), Owner = user, Type = CollectionType.USER, Status = CollectionStatus.COMPLETE, Photos = photos }; CollectionRepository.Insert(c); Unit.Commit(); }
private CollectionViewModel GetCollectionViewModel(long siteID, long year) { CollectionViewModel model = new CollectionViewModel(); model.Collection = CollectionRepository.First(c => c.Site.ID == siteID); model.SiteCoords = string.Format("{0}, {1}", model.Collection.Site.Latitude, model.Collection.Site.Longitude); List <Photo> photos = PhotoRepository.Find(p => p.Site.ID == model.Collection.Site.ID).OrderBy(p => p.Captured).ToList <Photo>(); if (year != -1) { photos = photos.Where(p => p.Captured.Year == year).ToList <Photo>(); } model.SiteDetails = new SiteDetails() { PhotoCount = photos.Count(), First = photos.Select(p => p.Captured).First(), Last = photos.Select(p => p.Captured).Last() }; Phocalstream_Shared.Data.Model.Photo.User User = UserRepository.First(u => u.ProviderID == this.User.Identity.Name); if (User != null) { UserCollectionList userCollectionModel = new UserCollectionList(); userCollectionModel.User = User; userCollectionModel.Collections = CollectionRepository.Find(c => c.Owner.ID == User.ID && c.Type == CollectionType.USER, c => c.Photos).ToList(); model.UserCollections = userCollectionModel; } return(model); }
public ActionResult SiteDashboard(long siteID) { // Make sure the siteID belongs to a CameraSite if (CollectionRepository.Find(c => c.Site.ID == siteID && c.Type == CollectionType.SITE).FirstOrDefault() == null) { return(RedirectToAction("SiteList", "Home", null)); } else { SiteDashboardViewModel model = new SiteDashboardViewModel(); model.CollectionViewModel = GetCollectionViewModel(siteID, -1); model.Years = GetSiteYearSummary(siteID); model.Tags = PhotoService.GetPopularTagsForSite(siteID); //Photo Frequency model.PhotoFrequency = GetPhotoFrequencyData(siteID); model.PhotoFrequency.SiteName = model.CollectionViewModel.Collection.Site.Name; model.PhotoFrequency.StartDate = model.CollectionViewModel.SiteDetails.First; Photo lastPhoto = PhotoRepository.Find(p => p.Site.ID == siteID).OrderBy(p => p.Captured).Last(); DateTime lastPhotoDate = lastPhoto.Captured; model.DroughtMonitorData = LoadDMData(DMDataType.COUNTY, lastPhotoDate, model.CollectionViewModel.Collection.Site.CountyFips); model.DroughtMonitorData.PhotoID = lastPhoto.ID; model.WaterData = LoadWaterData(model.CollectionViewModel.Collection.Site.Latitude, model.CollectionViewModel.Collection.Site.Longitude, lastPhotoDate); model.WaterData.PhotoID = lastPhoto.ID; return(View(model)); } }
/// <summary> /// 指定したディレクトリ直下のフォトのリストを返す /// </summary> /// <param name="directoryName"></param> /// <returns></returns> public IEnumerable <Photo> Execute(string directoryName) { IEnumerable <Domain.Model.File> files = photoFileService.FindAllPhotoFilesFromDirectory(directoryName); List <Photo> photosInDirectory = new List <Photo>(); foreach (File file in files) { Func <IQueryable <Photo>, Photo> query = allPhotos => { foreach (Photo photo in allPhotos) { if (photo.File.FilePath == file.FilePath) { return(photo); } } return(Photo.CreateFromFile(file)); }; Photo hitPhoto = photoRepository.Find(query); if (hitPhoto != null) { photosInDirectory.Add(hitPhoto); } else { photosInDirectory.Add(Photo.CreateFromFile(file)); } } return(photosInDirectory); }
public ActionResult Timelapse(long collectionId) { TimelapseModel model = new TimelapseModel(); Collection collection = CollectionRepository.Find(c => c.ID == collectionId, c => c.Photos, c => c.Site).FirstOrDefault(); if (collection != null) { model.CollectionId = collection.ID; model.Name = !String.IsNullOrWhiteSpace(collection.Name) ? collection.Name : "Dynamic Timelapse"; long[] ids; switch (collection.Type) { case CollectionType.SITE: ids = PhotoRepository.Find(p => p.Site.ID == collection.Site.ID).Select(p => p.ID).ToArray <long>(); break; case CollectionType.USER: ids = collection.Photos.Select(p => p.ID).ToArray <long>(); break; case CollectionType.SEARCH: ids = collection.Photos.Select(p => p.ID).ToArray <long>(); break; case CollectionType.TIMELAPSE: ids = collection.Photos.Select(p => p.ID).ToArray <long>(); break; default: ids = new long[0]; break; } if (ids.Length > 0) { model.DmWeeks = DZPhotoRepository.FindDmDatesForPhotos(ids); model.Frames = PhotoService.CreateTimeLapseFramesFromIDs(ids); long id = model.Frames.FirstOrDefault().PhotoID; Photo first = PhotoRepository.Find(p => p.ID == id, p => p.Site).FirstOrDefault(); model.CountyFips = first.Site.CountyFips; model.Latitude = first.Site.Latitude; model.Longitude = first.Site.Longitude; model.Width = first.Width; model.Height = first.Height; return(View(model)); } } return(RedirectToAction("Index", "Search", null)); }
/// <summary> /// 指定したディレクトリ直下のフォトのリストを返す /// </summary> /// <param name="dirpath"></param> /// <returns></returns> public List <Photo> Execute(string dirpath) { //ディレクトリパスが入力されていない場合 if (dirpath.Length == 0 || dirpath == null) { throw new ArgumentNullException("ディレクトリパスが入力されていません"); } //ディレクトリ内に存在する写真ファイルの一覧を取得(Fileインスタンス) IEnumerable <Domain.Model.File> files = photoFileService.FindAllPhotoFilesFromDirectory(dirpath); List <Photo> photosInDirectory = new List <Photo>(); foreach (File file in files) { //クエリ Func <IQueryable <Photo>, IQueryable <Photo> > query = allPhotos => { List <Photo> photos = new List <Photo>(); foreach (Photo photo in allPhotos) { if (photo.File.FilePath == file.FilePath) { photos.Add(photo); } } if (photos.Count() == 0) { photos.Add(Photo.CreateFromFile(file)); } return(photos.AsQueryable()); }; //既にDBに写真データが登録されているか Photo hitPhoto = photoRepository.Find(query).First(); //登録されていたら if (hitPhoto != null) { photosInDirectory.Add(hitPhoto); } //登録されていなかったら else { photosInDirectory.Add(Photo.CreateFromFile(file)); } } //写真ファイルが存在しなかった場合 if (photosInDirectory == null) { return(null); } return(photosInDirectory); }
public void RemoveFromExistingUserCollection(User user, long collectionID, string photoIds) { long[] ids = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray(); List <Photo> photos = PhotoRepository.Find(p => ids.Contains(p.ID)).ToList(); Collection collection = CollectionRepository.First(c => c.ID == collectionID && c.Type == CollectionType.USER, c => c.Photos); collection.Photos = collection.Photos.Except(photos).ToList(); collection.Status = CollectionStatus.INVALID; Unit.Commit(); }
public void AddToExistingUserCollection(User user, string collectionIds, string photoIds) { long[] ids = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray(); List <Photo> photos = PhotoRepository.Find(p => ids.Contains(p.ID)).ToList(); long[] cIds = collectionIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray(); List <Collection> collections = CollectionRepository.Find(c => cIds.Contains(c.ID) && c.Type == CollectionType.USER, c => c.Photos).ToList(); foreach (var col in collections) { col.Photos = col.Photos.Union(photos).ToList(); col.Status = CollectionStatus.INVALID; } Unit.Commit(); }
public void TogglePhotoInUserCollection(long photoID, long collectionID) { Collection col = CollectionRepository.First(c => c.ID == collectionID, c => c.Photos); if (col.Type == CollectionType.USER) { Photo photo = PhotoRepository.Find(photoID); if (col.Photos.Contains(photo)) { col.Photos.Remove(photo); } else { col.Photos.Add(photo); } col.Status = CollectionStatus.INVALID; Unit.Commit(); } }
public ICollection <TimeLapseFrame> CreateTimeLapseFramesFromIDs(long[] photoIDs) { List <TimeLapseFrame> frames = new List <TimeLapseFrame>(); long firstID = photoIDs[0]; // stupid LINQ USCounty county = DMRepository.GetCountyForFips(PhotoRepository.Find(p => p.ID == firstID, p => p.Site) .FirstOrDefault().Site.CountyFips); var properties = PhotoRepo.GetPhotoProperties(photoIDs, new string[] { "ID", "Captured" }); foreach (var property in properties) { var frame = new TimeLapseFrame() { FrameTime = (DateTime)property["Captured"], PhotoID = (long)property["ID"] }; frames.Add(frame); } return(frames); }
private PhotoFrequencyData GetPhotoFrequencyData(long siteID) { PhotoFrequencyData model = new PhotoFrequencyData(); var data = PhotoRepository.Find(p => p.Site.ID == siteID) .GroupBy(p => p.Captured.Date) .Select(group => new { Date = group.Key, Count = group.Count() }) .OrderBy(x => x.Date); model.FrequencyDataValues = ""; foreach (var d in data) { model.FrequencyDataValues += d.Count + ", "; } model.FrequencyDataValues = model.FrequencyDataValues.Substring(0, model.FrequencyDataValues.Length - 2); return(model); }
public long NewTimelapseCollection(User user, string timelapseName, string photoIds) { // Use the hash of the photoIds as the container id so we can check if timelapse already exists string containerID = Convert.ToString(photoIds.GetHashCode()); List <Photo> photos; long[] ids; // Only logged in users can own and name a collection if (user != null) { // See if the user already has a collection for those photos, if so return that collection id Collection existingUserCollection = CollectionRepository.Find(c => c.ContainerID == containerID & c.Owner.ID == user.ID).FirstOrDefault(); if (existingUserCollection != null) { // see if the name is the same, if not, overwrite if (!existingUserCollection.Name.Equals(timelapseName)) { existingUserCollection.Name = timelapseName; Unit.Commit(); } return(existingUserCollection.ID); } else { if (!String.IsNullOrWhiteSpace(photoIds)) { ids = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray(); photos = PhotoRepository.Find(p => ids.Contains(p.ID), p => p.Site).ToList(); Collection c = new Collection() { Name = timelapseName, ContainerID = containerID.ToString(), Owner = user, Type = CollectionType.TIMELAPSE, Status = CollectionStatus.COMPLETE, Photos = photos }; CollectionRepository.Insert(c); Unit.Commit(); return(c.ID); } } } else { // Since the user is not logged in, check if an un-owned copy of this collection exists Collection existingCollection = CollectionRepository.Find(c => c.ContainerID == containerID & c.Owner == null).FirstOrDefault(); if (existingCollection != null) { return(existingCollection.ID); } else { if (!String.IsNullOrWhiteSpace(photoIds)) { ids = photoIds.Split(',').Select(i => Convert.ToInt64(i)).ToArray(); photos = PhotoRepository.Find(p => ids.Contains(p.ID), p => p.Site).ToList(); Collection c = new Collection() { Name = timelapseName, ContainerID = containerID.ToString(), Owner = null, Type = CollectionType.TIMELAPSE, Status = CollectionStatus.COMPLETE, Photos = photos }; CollectionRepository.Insert(c); Unit.Commit(); return(c.ID); } } } // something went wrong, so return -1 return(-1); }