|
View:
New views
17 Messages
—
Rating Filter:
Alert me
|
|
|
Some guidance needed pleaseHi
My existing Catalyst application is being extended. I want to keep a record of previous passwords used by a user to prevent them being re-used. I have Model 'UsedPassword' to keep track of the previous 8 (say) passwords as so- package MyApp::Schema::UsedPassword; use strict; use base qw(DBIx::Class); __PACKAGE__->load_components(qw(PK::Auto Core)); __PACKAGE__->table('used_password'); __PACKAGE__->add_columns(qw(id user password)); __PACKAGE__->set_primary_key('id'); So, if I want a method (create_limited) to create a new UsedPassword object, that ensures no more that 8 (say) passwords are stored in the database (against each User) where should it go? Ideally (I think) I would like to do something like $c->model('DBIC::UsedPassword')->create_limited({ user => $user->id, password => $password, }); but i can't see how to add it to MyApp::Schema::UsedPassword (since $c->model('DBIC::UsedPassword') returns a ResultSet not a MyApp::Schema::UsedPassword) Any other suggestions where to put it (polite one's only please)? Regards Ian _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseI have found a thread on DBIx-class mailing list that throws some light
on this using http://search.cpan.org/~ash/DBIx-Class-0.08006/lib/DBIx/Class/Schema.pm#load_namespaces This seems to solve the problem for putting such logic into the Model/Schema but would it be better to put this type of logic into a business logic layer? In which case how would I obtain a $schema object? Would I have to then pass this as a parameter to the method? Regards Ian Ian Docherty wrote: > Hi > > My existing Catalyst application is being extended. I want to keep a > record of previous passwords used by a user to prevent them being > re-used. > > I have Model 'UsedPassword' to keep track of the previous 8 (say) > passwords as so- > > package MyApp::Schema::UsedPassword; > use strict; > use base qw(DBIx::Class); > > __PACKAGE__->load_components(qw(PK::Auto Core)); > __PACKAGE__->table('used_password'); > __PACKAGE__->add_columns(qw(id user password)); > __PACKAGE__->set_primary_key('id'); > > So, if I want a method (create_limited) to create a new UsedPassword > object, that ensures no more that 8 (say) passwords are stored in the > database (against each User) where should it go? > > Ideally (I think) I would like to do something like > > $c->model('DBIC::UsedPassword')->create_limited({ > user => $user->id, > password => $password, > }); > > but i can't see how to add it to MyApp::Schema::UsedPassword (since > $c->model('DBIC::UsedPassword') returns a ResultSet not a > MyApp::Schema::UsedPassword) > > Any other suggestions where to put it (polite one's only please)? > > Regards > Ian > > > _______________________________________________ > List: Catalyst@... > Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst > Searchable archive: > http://www.mail-archive.com/catalyst@.../ > Dev site: http://dev.catalyst.perl.org/ > _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseOn 13/09/2007, Ian Docherty <catalyst@...> wrote:
I have found a thread on DBIx-class mailing list that throws some light _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseWill Hawes wrote:
... > > Isn't this just a case of adding a create_limited() method to your > model class? > > package MyApp::Schema::UsedPassword; > ... > sub create_limited { > my( $self, $user, $password ) = @_; > # password checking logic here > } > > In your controller: > > $c->model('DBIC::UsedPassword')->create_limited( ... ); to do that... Can't locate object method "create_limited" via package "DBIx::Class::ResultSet Regards Ian _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseMy application has (effectively, subject to some cut and paste) the
following. ################ package MyApp::Schema; use strict; use warning; use base qw(DBIx::Class::Schema); __PACKAGE__->load_classes(qw( UsedPassword )); 1; ################ package MyApp::Schema::UsedPassword; use strict; use warning; use base qw(DBIx::Class); __PACKAGE__->load_components(qw(PK::Auto Core)); __PACKAGE__->table('used_password'); __PACKAGE__->add_columns(qw(id user password)); __PACKAGE__->set_primary_key('id'); sub create_limited { my ($self, $user, $password) = @_; # password checking logic here } 1; ################ package MyApp::Model::DBIC; use strict; use warning; use base qw(Catalyst::Model::DBIC::Schema); __PACKAGE__->config( schema_class => 'MyApp::Schema', connect_info => [ MyApp->config->{db}, MyApp->config->{db_user}, MyApp->config->{db_password}, {AutoCommit => 1, quote_char => '`', name_sep => '.'}, ]); 1; ################ As I mentioned, if I try to do a call to $c->model('DBIC::UsedPassword')->create_limited( ... ); I get the fatal error Can't locate object method "create_limited" via package "DBIx::Class::ResultSet Which is why I think this is not the approach, unless you know otherwise? Regards Ian _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseOn 13/09/2007, Ian Docherty <catalyst@...> wrote:
My application has (effectively, subject to some cut and paste) the Whoops, my bad. $c->model() does indeed return a DBIx::Class::ResultSet, so you would need to retrieve/create an instance of your UsedPassword class from the resultset in order to call any methods on it: my $used_password = $c->model('DBIC::UsedPassword')->create( { user => 'user', password => 'password' } ); $used_password->foo_method() Having said that, if I understand correctly what you are trying to do, you probably don't want a create_limited method at all. I think you need to override the new() method in your UsedPassword class and perform the checks there instead: package MyApp::Schema::UsedPassword; ... sub new { my ( $class, $attrs ) = @_; my $user = $attrs->{user}; my $password = $attrs->{password}; # password checking logic here my $new = $class->next::method($attrs); return $new; } Also (and this may have been a typo on your part, but just in case), please note it's "use warnings" not "use warning" to enable warnings in Perl. Hope the above is useful. _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseWill Hawes wrote:
> > Whoops, my bad. $c->model() does indeed return a DBIx::Class::ResultSet, > so you would need to retrieve/create an instance of your UsedPassword > class from the resultset in order to call any methods on it: > > my $used_password = $c->model('DBIC::UsedPassword')->create( { user => > 'user', password => 'password' } ); > $used_password->foo_method() IIRC, can't you get the original record source back from the resultset ? my $used_password = $c->model('DBIC::UsedPassword')->result_source->create_limited(); S. _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseOn Thu, Sep 13, 2007 at 10:58:08AM +0100, Ian Docherty wrote:
> I have found a thread on DBIx-class mailing list that throws some light > on this using > > http://search.cpan.org/~ash/DBIx-Class-0.08006/lib/DBIx/Class/Schema.pm#load_namespaces > > This seems to solve the problem for putting such logic into the > Model/Schema but would it be better to put this type of logic into a > business logic layer? In which case how would I obtain a $schema object? > Would I have to then pass this as a parameter to the method? The model -is- where your business logic lives. The real question is whether your ORM should be directly in the model or not, but that's a whole different thread. -- Matt S Trout Need help with your Catalyst or DBIx::Class project? Technical Director Want a managed development or deployment platform? Shadowcat Systems Ltd. Contact mst (at) shadowcatsystems.co.uk for a quote http://chainsawblues.vox.com/ http://www.shadowcat.co.uk/ _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseOn Thu, Sep 13, 2007 at 10:27:04AM +0100, Ian Docherty wrote:
> Hi > > My existing Catalyst application is being extended. I want to keep a > record of previous passwords used by a user to prevent them being re-used. > > I have Model 'UsedPassword' to keep track of the previous 8 (say) > passwords as so- > > package MyApp::Schema::UsedPassword; > use strict; > use base qw(DBIx::Class); > > __PACKAGE__->load_components(qw(PK::Auto Core)); > __PACKAGE__->table('used_password'); > __PACKAGE__->add_columns(qw(id user password)); > __PACKAGE__->set_primary_key('id'); > > So, if I want a method (create_limited) to create a new UsedPassword > object, that ensures no more that 8 (say) passwords are stored in the > database (against each User) where should it go? > > Ideally (I think) I would like to do something like > > $c->model('DBIC::UsedPassword')->create_limited({ > user => $user->id, > password => $password, > }); > > but i can't see how to add it to MyApp::Schema::UsedPassword (since > $c->model('DBIC::UsedPassword') returns a ResultSet not a > MyApp::Schema::UsedPassword) > > Any other suggestions where to put it (polite one's only please)? Why not just have it as $user->_add_to_used_passwords and then hook that into $user->insert + ->update ? Perhaps better still, why not just make this a trigger? (unless you're using MySQL, in which case s/make this a trigger/use a database/ :) -- Matt S Trout Need help with your Catalyst or DBIx::Class project? Technical Director Want a managed development or deployment platform? Shadowcat Systems Ltd. Contact mst (at) shadowcatsystems.co.uk for a quote http://chainsawblues.vox.com/ http://www.shadowcat.co.uk/ _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseSimon Wilcox wrote:
> Will Hawes wrote: >> >> Whoops, my bad. $c->model() does indeed return a >> DBIx::Class::ResultSet, so you would need to retrieve/create an >> instance of your UsedPassword class from the resultset in order to >> call any methods on it: >> >> my $used_password = $c->model('DBIC::UsedPassword')->create( { user >> => 'user', password => 'password' } ); >> $used_password->foo_method() > > IIRC, can't you get the original record source back from the resultset ? > > my $used_password = > $c->model('DBIC::UsedPassword')->result_source->create_limited(); > > S. $c->model('DBIC::UsedPassword')->result_class->create_limited(); it works. So that should do for now, thanks Simon and Will for your help ;) Regards Ian _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseOn Thu, Sep 13, 2007 at 03:14:58PM +0100, Ian Docherty wrote:
> Simon Wilcox wrote: > >Will Hawes wrote: > >> > >>Whoops, my bad. $c->model() does indeed return a > >>DBIx::Class::ResultSet, so you would need to retrieve/create an > >>instance of your UsedPassword class from the resultset in order to > >>call any methods on it: > >> > >>my $used_password = $c->model('DBIC::UsedPassword')->create( { user > >>=> 'user', password => 'password' } ); > >>$used_password->foo_method() > > > >IIRC, can't you get the original record source back from the resultset ? > > > >my $used_password = > >$c->model('DBIC::UsedPassword')->result_source->create_limited(); > > > >S. > Almost, if I do my $used_password = > $c->model('DBIC::UsedPassword')->result_class->create_limited(); > > it works. So that should do for now, thanks Simon and Will for your help ;) No. Don't do that. Really don't. It's utterly broken. -- Matt S Trout Need help with your Catalyst or DBIx::Class project? Technical Director Want a managed development or deployment platform? Shadowcat Systems Ltd. Contact mst (at) shadowcatsystems.co.uk for a quote http://chainsawblues.vox.com/ http://www.shadowcat.co.uk/ _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseIan Docherty wrote:
> As I mentioned, if I try to do a call to > $c->model('DBIC::UsedPassword')->create_limited( ... ); I get the > fatal error > > Can't locate object method "create_limited" via package > "DBIx::Class::ResultSet > > Which is why I think this is not the approach, unless you know otherwise? I'm not sure I would structure the code exactly like you did. I think I would add a method to the User class like: package My::Schema::User; ... sub set_password { txn_do(update current password, update used passwords) } Then you can say something like: $c->model('DBIC::Users')->find(42)->set_password('foobarbaz'); and have everything work. Finally, if you want your create_limited to work, try: package My::ResultSet::UsedPassword; use base 'DBIx::Class::ResultSet'; sub create_limited { ... }; package My::Schema::UsedPassword; __PACKAGE__->resultset_class('My::ResultSet::UsedPassword'); Regards, Jonathan Rockway _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseMatt S Trout wrote:
> On Thu, Sep 13, 2007 at 03:14:58PM +0100, Ian Docherty wrote: >> Almost, if I do my $used_password = >> $c->model('DBIC::UsedPassword')->result_class->create_limited(); >> >> it works. So that should do for now, thanks Simon and Will for your help ;) > > No. Don't do that. > > Really don't. > > It's utterly broken. Thanks. I'm not as familiar with the interaction of DBIx::Class and Catalyst::Model::* as you are (obviously, I didn't write 'em :) but from here: http://search.cpan.org/~ash/DBIx-Class-0.08007/lib/DBIx/Class/ResultSet.pm#result_class I find: result_class Arguments: $result_class? Return Value: $result_class An accessor for the class to use when creating row objects. Defaults to result_source->result_class - which in most cases is the name of the "table" class. This seems to be the right behaviour to me. Can you summarise why it is not ? Yet over here: http://search.cpan.org/~blblack/Catalyst-Model-DBIC-Schema-0.20/lib/Catalyst/Model/DBIC/Schema.pm I find: class Shortcut for ->schema->class So would the original be better written as: $c->model('DBIC::UsedPassword')->class->create_limited(); # ? If it's not this then the docs are really confusing and I'd really appreciate it if you could provide the correct usage or approach for this situation. Many thanks, Simon. _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseOn Thu, Sep 13, 2007 at 05:50:21PM +0100, Simon Wilcox wrote:
> Matt S Trout wrote: > >On Thu, Sep 13, 2007 at 03:14:58PM +0100, Ian Docherty wrote: > >>Almost, if I do my $used_password = > >>$c->model('DBIC::UsedPassword')->result_class->create_limited(); > >> > >>it works. So that should do for now, thanks Simon and Will for your help > >>;) > > > >No. Don't do that. > > > >Really don't. > > > >It's utterly broken. > > Thanks. I'm not as familiar with the interaction of DBIx::Class and > Catalyst::Model::* as you are (obviously, I didn't write 'em :) but from > here: > > http://search.cpan.org/~ash/DBIx-Class-0.08007/lib/DBIx/Class/ResultSet.pm#result_class > > I find: > > result_class > > Arguments: $result_class? > Return Value: $result_class > > An accessor for the class to use when creating row objects. > Defaults > to result_source->result_class - which in most cases is the name of > the "table" class. > > This seems to be the right behaviour to me. Can you summarise why it is > not ? No, result_class behaves perfectly. Trying to create a record via a class method is WRONG. This is not Class::DBI. Don't do it. Collection methods should go on resultset objects. Always. Class method stuff will easily break in all sorts of fun ways because DBIC isn't designed to work like that. > So would the original be better written as: > > $c->model('DBIC::UsedPassword')->class->create_limited(); # ? > > If it's not this then the docs are really confusing and I'd really > appreciate it if you could provide the correct usage or approach for > this situation. The docs are correct. That's just completely the wrong place for the create_limited method. -- Matt S Trout Need help with your Catalyst or DBIx::Class project? Technical Director Want a managed development or deployment platform? Shadowcat Systems Ltd. Contact mst (at) shadowcatsystems.co.uk for a quote http://chainsawblues.vox.com/ http://www.shadowcat.co.uk/ _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseSimon Wilcox wrote:
> Matt S Trout wrote: >> On Thu, Sep 13, 2007 at 03:14:58PM +0100, Ian Docherty wrote: >>> Almost, if I do my $used_password = >>> $c->model('DBIC::UsedPassword')->result_class->create_limited(); >>> >>> it works. So that should do for now, thanks Simon and Will for your help ;) >> No. Don't do that. >> >> Really don't. >> >> It's utterly broken. > > Thanks. I'm not as familiar with the interaction of DBIx::Class and > Catalyst::Model::* as you are (obviously, I didn't write 'em :) but from > here: > > http://search.cpan.org/~ash/DBIx-Class-0.08007/lib/DBIx/Class/ResultSet.pm#result_class > > I find: > > result_class > > Arguments: $result_class? > Return Value: $result_class > > An accessor for the class to use when creating row objects. > Defaults > to result_source->result_class - which in most cases is the name of > the "table" class. > > This seems to be the right behaviour to me. Can you summarise why it is > not ? > > Yet over here: > > http://search.cpan.org/~blblack/Catalyst-Model-DBIC-Schema-0.20/lib/Catalyst/Model/DBIC/Schema.pm > > I find: > > class > > Shortcut for ->schema->class > > > So would the original be better written as: > > $c->model('DBIC::UsedPassword')->class->create_limited(); # ? > Wouldn't it just be nicer if you could do: $c->model('DBIC::UsedPassword')->create Create a new class that inherits from DBIx::Class::ResultSet. then do __PACKAGE__->resultset_class('...::ResultSet::UsedPassword'); In your source class. Nicer, no? _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseMatt S Trout wrote:
> The docs are correct. > > That's just completely the wrong place for the create_limited method. I'd better read them more thoroughly then :-) I'm coming at this as an ex-Class::DBI user who uses DBIx::Class every few months. Each time I come into contact with it the state of the art has moved on so much it feels like I'm re-learning everything. But that is most definitely my problem ! I appreciate that RTFM is the right way to go but could you give me a clue as where the right place for the create_limited method would be ? Many thanks, Simon _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
|
|
Re: Some guidance needed pleaseOn Fri, Sep 14, 2007 at 12:43:15PM +0100, Simon Wilcox wrote:
> Matt S Trout wrote: > > >The docs are correct. > > > >That's just completely the wrong place for the create_limited method. > > I'd better read them more thoroughly then :-) > > I'm coming at this as an ex-Class::DBI user who uses DBIx::Class every > few months. Each time I come into contact with it the state of the art > has moved on so much it feels like I'm re-learning everything. But that > is most definitely my problem ! > > I appreciate that RTFM is the right way to go but could you give me a > clue as where the right place for the create_limited method would be ? Rule of thumb: If it would have been a class method in CDBI code it probably wants to be a resultset method in DBIC. As I noted in my initial reply to the OP though, I'd probably override insert+update on my user object to call an _add_pw_to_used_list method or similar; whether that then calls a create_limited resultset method for usedpassword or handles the logic itself doesn't strike me as that important. -- Matt S Trout Need help with your Catalyst or DBIx::Class project? Technical Director Want a managed development or deployment platform? Shadowcat Systems Ltd. Contact mst (at) shadowcatsystems.co.uk for a quote http://chainsawblues.vox.com/ http://www.shadowcat.co.uk/ _______________________________________________ List: Catalyst@... Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@.../ Dev site: http://dev.catalyst.perl.org/ |
| Free embeddable forum powered by Nabble | Forum Help |