Website openantrag.de
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
OpenAntrag/OpenAntragLib/Models/Proposal/Proposals.vb

554 lines
18 KiB

Imports Raven.Client
Imports System.Text
Imports System.Web
Public Class Proposals
Public Shared Function SearchFor(strTerms As String) As List(Of Proposal)
'... http://stackoverflow.com/questions/4314545/ravendb-full-text-search
'http://ravendb.net/docs/2.0/client-api/querying/static-indexes/searching
'http://ravendb.net/docs/client-api/querying/static-indexes/configuring-index-options
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
lst = ds.Query(Of Proposal)().Search(Function(x) x.Text, strTerms).ToList()
End Using
Return lst
End Function
Public Shared Function GetByRepresentation(rep As Representation) As List(Of Proposal)
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
'max. 128 / 1024! > http://ravendb.net/docs/2.0/intro/safe-by-default
' http://ravendb.net/kb/31/my-10-tips-and-tricks-with-ravendb
' https://groups.google.com/forum/#!msg/ravendb/UcLmIajTTq4/Lpke9qd13woJ
Dim query = ds.Query(Of Proposal)() _
.OrderByDescending(Function(e) e.Timestamp) _
.Where(Function(e) e.Key_Representation = rep.Key)
If query.Count > 0 Then
lst = query.ToList
End If
End Using
Return lst
End Function
Public Shared Function GetItemsTop(count As Integer) As List(Of Proposal)
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
'TODO: Order & Take
'http://stackoverflow.com/questions/8931289/ravendb-orderbydescending-and-take-incorrect-results
'http://ravendb.net/docs/client-api/querying/stale-indexes
'http://ravendb.net/docs/2.0/client-api/querying/query-and-lucene-query
'Dim stats As New Raven.Client.RavenQueryStatistics
'Dim query = ds.Query(Of Proposal)() _
' .Statistics(stats) _
' .Customize(Function(x) x.WaitForNonStaleResultsAsOfNow()) _
' .OrderByDescending(Function(e) e.CreatedAt) _
' .Take(count)
Dim query = ds.Query(Of Proposal)() _
.Where(Function(e) e.IsTest = False) _
.OrderByDescending(Function(e) e.Timestamp) _
.Take(count)
If query.Count > 0 Then
lst = query.ToList
'lst = lst.Take(count).ToList()
End If
End Using
Return lst
End Function
Public Shared Function GetItemsTopByRepresentation(rep As Representation,
count As Integer) As List(Of Proposal)
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
Dim query = ds.Query(Of Proposal)() _
.Where(Function(e) e.Key_Representation = rep.Key) _
.OrderByDescending(Function(e) e.Timestamp) _
.Take(count)
If query.Count > 0 Then
lst = query.ToList
'lst = lst.Take(count).ToList()
End If
End Using
Return lst
End Function
Public Shared Function GetItemsCount() As Integer
Dim intCount As Integer = -1
Using ds As IDocumentSession = DataDocumentStore.Session
Dim stats As New RavenQueryStatistics
Dim query = ds.Query(Of Proposal)() _
.Statistics(stats) _
.Where(Function(e) e.IsTest = False) _
.Take(0).ToArray()
intCount = stats.TotalResults
End Using
Return intCount
End Function
Public Shared Function GetItemsCountByRepresentation(rep As Representation) As Integer
Dim intCount As Integer = -1
Using ds As IDocumentSession = DataDocumentStore.Session
Dim stats As New RavenQueryStatistics
Dim query = ds.Query(Of Proposal)() _
.Statistics(stats) _
.Where(Function(e) e.Key_Representation = rep.Key) _
.Take(0).ToArray()
'AndAlso e.IsTest = False
intCount = stats.TotalResults
End Using
Return intCount
End Function
Public Shared Function GetItemsPage(pageNo As Integer,
pageCount As Integer) As List(Of Proposal)
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
Dim query = ds.Query(Of Proposal)() _
.Where(Function(e) e.IsTest = False) _
.OrderByDescending(Function(e) e.Timestamp) _
.Skip((pageNo - 1) * pageCount).Take(pageCount)
If query.Count > 0 Then
lst = query.ToList
End If
End Using
Return lst
End Function
'TODO: http://daniellang.net/joining-documents-in-ravendb-2-0/
' http://ravendb.net/docs/2.0/client-api/querying/handling-document-relationships
' http://www.w3enterprises.com/articles/beginner-guide-to-ravendb.aspx
'Public Shared Function GetItemsPageByFederalState(federal As String,
' pageNo As Integer,
' pageCount As Integer) As List(Of Proposal)
' Dim lst As New List(Of Proposal)
' Using ds As IDocumentSession = DataDocumentStore.Session
' Dim query = ds.Query(Of Proposal)() _
' .Where(Function(e) e.IsTest = False) _
' .OrderByDescending(Function(e) e.Timestamp) _
' .Skip((pageNo - 1) * pageCount).Take(pageCount)
' If query.Count > 0 Then
' lst = query.ToList
' End If
' End Using
' Return lst
'End Function
Public Shared Function GetItemsPageByRepresentation(rep As Representation,
pageNo As Integer,
pageCount As Integer) As List(Of Proposal)
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
Dim query = ds.Query(Of Proposal)() _
.Where(Function(e) e.Key_Representation = rep.Key) _
.OrderByDescending(Function(e) e.Timestamp) _
.Skip((pageNo - 1) * pageCount).Take(pageCount)
If query.Count > 0 Then
lst = query.ToList
'lst = lst.ToList.Skip((pageNo - 1) * pageCount).Take(pageCount).ToList()
End If
End Using
Return lst
End Function
Public Shared Function GetItemsByTag(tag As ProposalTag) As List(Of Proposal)
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
Dim query = ds.Query(Of Proposal)() _
.Where(Function(x) x.Tags.Contains(tag.Tag) = True AndAlso x.IsTest = False) _
.OrderByDescending(Function(e) e.Timestamp)
If query.Count > 0 Then
lst = query.ToList
'lst.Sort(New Comparison(Of Proposal)(Function(x As Proposal, y As Proposal) CType(y.CreatedAt, DateTime).CompareTo(CType(x.CreatedAt, DateTime))))
End If
End Using
Return lst
End Function
Public Shared Function GetItemsByTagAndRepresentation(rep As Representation,
tag As ProposalTag) As List(Of Proposal)
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
Dim query = ds.Query(Of Proposal)() _
.Where(Function(x) x.Key_Representation = rep.Key AndAlso x.Tags.Contains(tag.Tag)) _
.OrderByDescending(Function(e) e.Timestamp)
If query.Count > 0 Then
lst = query.ToList
'lst.Sort(New Comparison(Of Proposal)(Function(x As Proposal, y As Proposal) CType(y.CreatedAt, DateTime).CompareTo(CType(x.CreatedAt, DateTime))))
End If
End Using
Return lst
End Function
Public Shared Function GetItemsCommentCount() As Integer
Dim intRetVal As Integer = -1
Dim lst As New List(Of Proposal)
Using ds As IDocumentSession = DataDocumentStore.Session
Dim query = ds.Query(Of Proposal)("ProposalsWithComments")
intRetVal += query.ToList().Sum(Function(p) p.ProposalComments.Count)
End Using
Return intRetVal
End Function
Public Shared Function GetById(id As String) As Proposal
Dim prop As Proposal = Nothing
Using ds As IDocumentSession = DataDocumentStore.Session
Dim entity = ds.Load(Of Proposal)(id)
If entity IsNot Nothing Then
prop = entity
End If
End Using
Return prop
End Function
Public Shared Function GetByTitleUrl(rep As Representation,
titleUrl As String) As Proposal
Dim prop As Proposal = Nothing
Dim lst As List(Of Proposal) = GetByRepresentation(rep)
'Dim query = From p As Proposal In lst
' Where p.TitleUrl = titleUrl
' Select p
'If query.Count > 0 Then
' prop = query.First
'End If
Using ds As IDocumentSession = DataDocumentStore.Session
Dim query = ds.Query(Of Proposal)()
query = query.Where(Function(e) e.Key_Representation = rep.Key)
query = query.Where(Function(e) e.TitleUrl = titleUrl)
If query.Count > 0 Then
prop = query.First
End If
End Using
Return prop
End Function
Public Shared Sub SearchItems(ByRef srm As SearchModel,
pageNo As Integer,
pageCount As Integer)
Try
Using ds As IDocumentSession = DataDocumentStore.Session
Dim query = ds.Query(Of Proposal)("FulltextByTextAndTitle") _
.Search(Function(m) m.Text, srm.SearchTerms, options:=SearchOptions.Or) _
.Search(Function(m) m.Title, srm.SearchTerms, options:=SearchOptions.Or)
If query.Count > 0 Then
srm.Results = query.ToList()
End If
End Using
Catch ex As Exception
End Try
End Sub
Public Shared Function TitleUrlExists(rep As Representation,
titleUrl As String) As Boolean
Dim bolRetVal As Boolean = False
Dim lst As List(Of Proposal) = GetByRepresentation(rep)
Dim query = From p As Proposal In lst
Where p.TitleUrl = titleUrl
Select p
If query.Count > 0 Then
bolRetVal = True
End If
Return bolRetVal
End Function
Public Shared Function GetProcessStepCaption(caption As String,
p As Proposal,
m As Representation) As String
Dim stb As New StringBuilder(caption)
If caption.Contains("%COMMITTEE%") = True Then
If String.IsNullOrEmpty(p.Key_Committee) = False Then
Dim query = From c As Committee In m.Committees
Where c.Key = p.Key_Committee
Select c
If query.Count > 0 Then
stb.Replace("%COMMITTEE%", query.First.Name)
End If
End If
End If
If caption.Contains("%REPRESENTATIVE%") = True Then
If String.IsNullOrEmpty(p.Key_Representative) = False Then
Dim query = From r As Representative In m.Representatives
Where r.Key = p.Key_Representative
Select r
If query.Count > 0 Then
stb.Replace("%REPRESENTATIVE%", query.First.Name)
End If
End If
End If
Return stb.ToString
End Function
Public Shared Function CreateNew(keyRepresentation As String,
title As String,
text As String,
tagList As String,
contactInfo As String) As Proposal
Dim rep As Representation = GlobalData.Representations.GetByKey(keyRepresentation.ToLower)
Dim model As New Proposal(rep) With {
.Title = title.StripSpecialCharsForTitle,
.Text = text,
.ContactInfo = contactInfo
}
If title.StartsWith("TEST:") Or rep.IsTest = True Then
model.IsTest = True
End If
Dim stbUrl As New StringBuilder(Tools.MakeReadableUrl(model.Title))
If Proposals.TitleUrlExists(rep, stbUrl.ToString) = True Then
stbUrl.Append("-").Append(Format(DateTime.Now, "yyMMddHHmm"))
End If
model.TitleUrl = stbUrl.ToString
If model.IsTest = False Then
model.ShortUrl = UrlShortener.GetShortUrl(model.FullUrl)
End If
Dim ps As New ProposalStep
ps.Id = "1"
ps.ID_ProcessStep = 1
'ps.Info = "Eingang des Antrags"
model.ProposalSteps.Add(ps)
model.ID_CurrentProposalStep = ps.Id
If HttpContext.Current.User.Identity.IsAuthenticated = True Then
model.CreatedBy = HttpContext.Current.User.Identity.Name
End If
Dim newID As String
Using ds As IDocumentSession = DataDocumentStore.Session()
ds.Store(model)
newID = model.Id
Dim tags As ProposalTags = ProposalTags.Load()
SaveTags(model, tags, tagList)
ds.Store(tags)
ds.SaveChanges()
End Using
MailManager.SendNewProposal(model)
PushoverManager.SendNewProposal(model)
TwitterManager.TweetNewProposal(model)
NotificationManager.StoreNewProposal(model)
PushbulletManager.SendNewProposal(model)
Return model
End Function
Public Shared Sub SaveTags(ByRef prop As Proposal,
ByRef tags As ProposalTags,
ByVal tagList As String)
If prop.Tags Is Nothing Then prop.Tags = New List(Of String)
Dim lstTagsNew As List(Of String) = tagList.Split(",").ToList
Dim lstTagsOld As List(Of String) = prop.Tags
'Tag in Proposal speichern
prop.Tags = lstTagsNew
'Proposal in Tag speichern (Add/Delete)
Dim lstAddTags As IEnumerable(Of String) = lstTagsNew.Except(lstTagsOld)
Dim lstDeleteTags As IEnumerable(Of String) = lstTagsOld.Except(lstTagsNew)
'(Add)
For Each s As String In lstAddTags
If String.IsNullOrEmpty(s) = False Then
Dim query = From tag As ProposalTag In tags.Items
Where tag.Tag = s
Select tag
If query.Count > 0 Then
Dim tag As ProposalTag = query.First
If prop.IsTest = False Then
If tag.Proposals Is Nothing Then tag.Proposals = New List(Of String)
tag.Proposals.Add(prop.Id)
End If
Else
Dim newTag As New ProposalTag(s)
newTag.Proposals = New List(Of String)
newTag.Proposals.Add(prop.Id)
tags.Items.Add(newTag)
End If
End If
Next
'(Delete)
For Each s As String In lstDeleteTags
If String.IsNullOrEmpty(s) = False Then
Dim query = From tag As ProposalTag In tags.Items
Where tag.Tag = s
Select tag
If query.Count > 0 Then
Dim tag As ProposalTag = query.First
tag.Proposals.Remove(prop.Id)
If tag.Proposals.Count = 0 Then
tags.Items.Remove(tag)
End If
End If
End If
Next
End Sub
Public Shared Sub SaveNextStep(ByRef prop As Proposal,
idStep As Integer,
info As String,
keyRepresentative As String,
keyCommittee As String)
Dim ps As New ProposalStep
ps.Id = CType(prop.ID_CurrentProposalStep, Integer) + 1
ps.ID_ProcessStep = idStep
ps.Info = info.EnsureMarkdown
prop.ProposalSteps.Add(ps)
prop.ID_CurrentProposalStep = ps.Id
If keyRepresentative IsNot Nothing Then
prop.Key_Representative = keyRepresentative
End If
If keyCommittee IsNot Nothing Then
prop.Key_Committee = keyCommittee
End If
prop.UpdatedAt = Format(DateTime.Now, "dd.MM.yyyy HH:mm:ss")
If HttpContext.Current.User.Identity.IsAuthenticated = True Then
prop.UpdatedBy = HttpContext.Current.User.Identity.Name
End If
Using ds As IDocumentSession = DataDocumentStore.Session()
ds.Store(prop)
ds.SaveChanges()
End Using
End Sub
End Class