I would like to keep both things separated:
- Attributes for URLs
- Access without login
What do you think?
Regards,
Thomas
Am Mittwoch, 25. April 2018 14:04:22 UTC+2 schrieb TonyF-UK:
>
> Interestingly, I am thinking on something similar too - having a
> report/notifications/actions view that have an auto generated URL. The
> idea (on my concept) is that by getting this unique URL via email, a
> user can access the report/action without needing to actually login -
> the fact that a user accesses the url is authenticaton - it could
> optionally require a password, since the userid is effectively part of
> the URL
>
> My thoughts :
>
> Either a specific
>
> A Notification/Report Model where one of the fields will be the
> unique URL id
> An incoming URL with the right path would search for the
> notification model with the extracted URL id
> My views would search my models for the incoming Id, and
> confirm expected users, permissions etc.
> I would only have one view that needs this so my specific
> solution would be highly specific
>
>
> Or a generic solution
>
> A model for URLs and that model can have a one to one or one to one
> to many relationship with other models; clearly this relationship is
> dynamic so - I see this :
>
> In the Model :
>
> from hrefgeneric.models import HRefModel
>
> class Notification(models.Model)
> href = models.OneToOne(HRefModel, ...)
> ...
>
> In the views
>
> from hrefgeneric.views import HRefRequiredMixin
>
> class NotificationView(HRefRequiredMixin, View):
> class HREFRequired:
> login_url = '/login/'
> redirect_field_name='redirect_to'
> user_name_field = 'username'
>
> def get(self, HRef):
> # HRef is now the HRef instance relevant to the
> incoming request (not just any text extracted from the URL
> pass
> def post(self, HRef):
> # HRef is now the HRef instance relevant to the
> incoming request (not just any text extracted from the URL
> pass
>
>
> If login_url is set to anything truthy, then the mixin will enforce
> some form of authentication form, with 'user_name_field' set to the
> expected user name of the HRef (assuming the expected user on the
> HRef is not None).
>
> For the generic solution it would be great if there a decorator for
> non class based views which does something similar.
>
> The HRef instance needs the following fields
>
> field_name = <field_name> # The name of any URL field that
> this HREF should be matched on
> field_value = <value> # The value that the above field
> should have for this HREF
> user = <The expected user> # The user that is allowed to
> access this HREF - can be None
> group = <permission group> # The permission Group that the
> user - can be None
> permission = <Permissions> # One or more permissions that
> the user - can be None
>
> On creation, field_name & field_value must be set
>
> Example:
> a pattern like this :
> path('/notification/<id>', my_view)
>
> and a href instance :
> HRef(field_name='id', field_value='aabbccddeeff')
>
> would match against an incoming path of
> http://host/notification/aabbccddeeff
>
> It might be that we need to match multiple fields on a url - not
> sure how we do this.
>
> I would happily contribute to an Django appropriate plugin etc - it
> seems like there is a lot of commonality between the use cases.
>
> --
> Anthony Flury
> email : *[email protected] <javascript:>*
> Twitter : *@TonyFlury <https://twitter.com/TonyFlury/>*
>
>
> On 25/04/18 09:30, guettli wrote:
> > Thank Adrien for sharing your knowledge.
> >
> > Our use cases have some parts that are common and some
> > parts that are distinct.
> >
> > You want actions, I want static attributes.
> >
> > You define them on the model.
> >
> > I use URLs. In my case sometimes there is a 1:1 relationship between
> > URL and model,
> > but sometimes not.
> >
> > In my use case I have reports. I want a report to have a preview html
> > snippet.
> >
> > There are N reports (N URLs) for one model.
> >
> > But I think there are more common things than distinct things.
> >
> > One URL can have N attributes.
> >
> > Some are actions, some static ones.
> >
> > Where these attributes come from is a different topic.
> >
> > If the URL represents a model, the attributes (in your case
> > "actions") of the model
> > can be propagated up to the URL.
> >
> > I hope you undestand what I wrote. If not, then tell me.
> >
> > Up to now these are just basic thoughts. I won't do any coding
> > during the next days. If someone likes this idea and implements it,
> > please let me know. I am always curious.
> >
> > Regards,
> > Thomas
> >
> >
> >
> > Am Montag, 23. April 2018 12:22:32 UTC+2 schrieb Adrien Cossa:
> >
> > Hi,
> >
> > On 04/23/2018 10:59 AM, guettli wrote:
> >> I have a vague idea to use OOP for a hyperlink.
> >>
> >> A hyperlink has these attributes for me:
> >>
> >> - href
> >> - verbose name
> >> - Permission: Is the current user allowed to follow the link?
> >> - Preview (on-mouse-over tooltip)
> >
> > We have developed something similar in the company I work for. The
> > use case is not exactly the same as yours, but we end up with some
> > "Action" object that are similar to your "Hyperlink".
> >
> > We have a mechanism based on mixins to define actions on our
> > models, for example let's say "create child node". Now each action
> > has some attributes telling what to display (e.g. "Create new
> > child node") and what should happen when we click on it (e.g. POST
> > to an URL). Now the interesting part is that we can also define
> > some restrictions for every action (e.g. "forbid if user is not
> > part of the manager group, or if a child already exist for the
> > current object, or ... etc") and we have a serializer mixin that
> > would automatically embed our actions information when serializing
> > the model object.
> >
> > It is then the frontend's job to display whatever you like
> > (description or restriction) when the mouse is over, and to make
> > the link clickable or not. If the user tries to trick us with a
> > manual request, we will not allow the action because the view /
> > model method execution is protected with the same restriction set.
> >
> > That is to say, after having defined a list of actions in a model
> > field, and a list of restriction for each action, we have a fully
> > working action description and restriction mechanism to manipulate
> > our objects. It looks a bit like this:
> >
> > class X(ModelWithActionsMixin, Model):
> > actions = [ Action(id="create_child", ...,
> > restrictions=[Restriction(...), ...], ]
> >
> > @protect(action_id="create")
> > def add_child(self):
> > ...
> >
> > or if you want to check the restrictions directly in your view
> > instead of protecting the method:
> >
> > class NodeCreateView(...):
> >
> > def post(self, ...):
> > obj = self.get_object()
> > try:
> > protect_action(obj, "add_child")
> > except ProtectedActionError as e:
> > raise Error400(...)
> > else:
> > obj.add_child()
> >
> >
> > Maybe you can use some similar mechanism for your implementation?
> >
> > PS: we are willing to make a proper package for our stuff and the
> > idea behind would be to release it as free module, but I can't
> > tell if that will really happen or when... but to see that you
> > need something similar will probably push us :-)
> >
> >
> >> I like Django because it handles the "href" part very smart (via
> >> reverse()).
> >>
> >> My current use case is the preview tooltip.
> >>
> >> The app I develop has roughly ten different report types.
> >>
> >> I can't remember the name, but I can remember how the report
> >> looked like.
> >>
> >> I recall the shape and colors of the report.
> >>
> >> That's why I would like to have a on-mouse-over tooltip for the
> >> hyperlink.
> >>
> >> For example look at these chart types:
> >> https://developers.google.com/chart/interactive/docs/gallery
> >> <https://developers.google.com/chart/interactive/docs/gallery>
> >>
> >> The tooltip should show a small version of the report/chart if I
> >> move the mouse over the hyperlink.
> >>
> >> I don't want to automate the creation of the preview images. It
> >> is enough if I am able to attach a small HTML snippet to
> >> each Django-URL. This HTML snippet should be used for the preview
> >> tooltip.
> >>
> >> What do you think?
> >>
> >> Regards,
> >> Thomas
> >> --
> >> You received this message because you are subscribed to the
> >> Google Groups "Django users" group.
> >> To unsubscribe from this group and stop receiving emails from it,
> >> send an email to [email protected] <javascript:>.
> >> To post to this group, send email to [email protected]
> >> <javascript:>.
> >> Visit this group at https://groups.google.com/group/django-users
> >> <https://groups.google.com/group/django-users>.
> >> To view this discussion on the web visit
> >>
> https://groups.google.com/d/msgid/django-users/c1df4a33-d077-42c4-8fd0-94902b4fad69%40googlegroups.com
>
> >> <
> https://groups.google.com/d/msgid/django-users/c1df4a33-d077-42c4-8fd0-94902b4fad69%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
>
> >> For more options, visit https://groups.google.com/d/optout
> >> <https://groups.google.com/d/optout>.
> >
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Django users" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> > an email to [email protected] <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > To post to this group, send email to [email protected]
> <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > Visit this group at https://groups.google.com/group/django-users.
> > To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/django-users/082da970-b691-45ae-b546-50a3515bbd76%40googlegroups.com
>
> > <
> https://groups.google.com/d/msgid/django-users/082da970-b691-45ae-b546-50a3515bbd76%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
>
> > For more options, visit https://groups.google.com/d/optout.
>
>
> --
> --
> Anthony Flury
> email : *[email protected] <javascript:>*
> Twitter : *@TonyFlury <https://twitter.com/TonyFlury/>*
>
>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/11ede0d7-3039-4242-9514-dee8d7a197dc%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.